覆盖Django序列化程序或模型创建方法

问题描述 投票:0回答:2

我正在尝试将数据添加到数据库中。为了这个目的,我有一个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的新手,所以我很难理解函数调用的精妙之处。

django django-models django-rest-framework django-serializer
2个回答
0
投票
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中创建对象的正确方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.