我正在尝试将数据添加到数据库中。为了这个目的,我有一个vue函数:
@api_view(['POST'])
def update_add_bges(request):
serializer = BGESSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
此调用序列化程序以在数据库中添加新数据:
class BGESSerializer(serializers.ModelSerializer):
laboratoire = LaboratoiresSerializer()
class Meta:
model = BGES
fields = '__all__'
def create(self, validated_data):
laboratoire_data = validated_data.pop('laboratoire')
laboratoire_oj = Laboratoire.objects.create(**laboratoire_data)
validated_data["laboratoire"] = laboratoire_obj["pk"]
bges = BGES.objects.create(**validated_data)
return bges
问题是我的Laboratoire类也嵌套了,应该添加其他类的实例:
class LaboratoiresSerializer(serializers.ModelSerializer):
tutelles = TutellesSerializer(many=True)
class Meta:
model = Laboratoire
fields = '__all__'
def create(self, validated_data):
tutelles_data = validated_data.pop('tutelles')
laboratoire = Laboratoire.objects.create(**validated_data)
for tutelle_data in tutelles_data:
t = Tutelle.objects.get(nom=tutelle_data["nom"])
laboratoire.tutelles.add(t)
return laboratoire
这不起作用,因为未调用,因为它是序列化器的创建而不是模型的创建。我应该怎么做 ?添加实验室时,我需要创建Tutelle。是否应该在模型中实现创建?由于我是django的新手,所以我很难理解函数调用的精妙之处。
class BGESSerializer(serializers.ModelSerializer):
laboratoire = LaboratoiresSerializer()
class Meta:
model = BGES
fields = '__all__'
def create(self, validated_data):
laboratoire_data = validated_data.pop('laboratoire')
laboratoire_obj = LaboratoiresSerializer.create(self, laboratoire_data)
validated_data["laboratoire"] = laboratoire_obj
bges = BGES.objects.create(**validated_data)
return bges
还有我这样的嵌套序列化器:
class TutellesSerializer(serializers.ModelSerializer):
class Meta:
model = SousDomaine
fields = ['pk', 'nom']
class DisciplinesSerializer(serializers.ModelSerializer):
class Meta:
model = SousDomaine
fields = ['pk', 'nom']
class SitesSerializer(serializers.ModelSerializer):
class Meta:
model = Site
fields = ['pk', 'nom']
class LaboratoiresSerializer(serializers.ModelSerializer):
tutelles = TutellesSerializer(many=True)
discipline = DisciplinesSerializer()
sites = SitesSerializer(many=True)
class Meta:
model = Laboratoire
fields = '__all__'
def create(self, validated_data):
tutelles_data = validated_data.pop('tutelles')
sites_data = validated_data.pop('sites')
discipline_data = validated_data.pop('discipline')
laboratoire = Laboratoire.objects.create(**validated_data)
for tutelle_data in tutelles_data:
t = Tutelle.objects.get(pk=tutelle_data["pk"])
laboratoire.tutelles.add(t)
for site_data in sites_data:
s, created = Site.objects.get_or_create(**sites_data)
laboratoire.sites.add(s)
d = SousDomaine.objects.get(pk=discipline_data["pk"])
laboratoire.discipline.set(d)
return laboratoire
所有这些都是从视图函数调用的:
@api_view(['POST'])
def update_add_bges(request):
serializer = BGESSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
从@api_view,如果我打印request.data一切都很好,我就拥有带有主键的纪律对象和tutelles对象,但是当我从BGESSerializer打印validated_data时,id消失了。我在做什么错了,这是在Django中创建对象的正确方法吗?