Django Rest Framework - 多对多 ID 列表消失

问题描述

我最近将 Django 升级到 3.1.5,将 DRF 升级到 3.12.2,但我的应用程序中的某些内容停止工作。

我的模型和序列化程序(简化)中有以下结构:

型号:

class A(models.Model):
    name = models.CharField(max_length=50)
  
class B(models.Model):
    a = models.ForeignKey(A,on_delete=models.CASCADE)
  
class C(models.Model):
    b = models.ForeignKey(B,on_delete=models.CASCADE)
  
class D(models.Model):
    c = models.ForeignKey(C,on_delete=models.CASCADE)
    name = models.CharField(max_length=50) 
    items = models.ManyToManyField(Item,blank=True)
  
class Item(models.Model):
    name = models.CharField(max_length=50)

序列化器:

class DSerializer(serializers.ModelSerializer):
  class Meta:
    model = models.D
    fields = ('name','items')

class CSerializer(serializers.ModelSerializer):
  d_set = DSerializer(many=True,read_only=False)
  
  class Meta:
    model = models.C
    fields = ('d_set',)

class BSerializer(serializers.ModelSerializer):
  c_set = CSerializer(many=True,read_only=False)
  
  class Meta:
    model = models.B
    fields = ('c_set',)

class ASerializer(serializers.ModelSerializer):
    b_set = BSerializer(many=True,read_only=False)
  
    class Meta:
        model = models.A
        fields = ('name','b_set')

    def createD(d_set,c):
        for d in d_set:
            items = d.pop('items')
            newD = models.D(c=c,**d)
            newD.save()
            for item in items:
                newD.add(item)
        
    def createB(self,b_set,a):
        for b in b_set:
            newB = models.B(a = a)
            newB.save()
            c_set = b.get("c_set")
            for c in c_set:
                d_set = c.pop("d_set")
                newC = models.C(b = b,**c)
                newC.save()
                self.createD(d_set,c)
                
    def create(self,validated_data):
        b_set = validated_data.pop('b_set')
        newA = models.A(**validated_data)
        newA.save();

        self.createB(b_set,newA)

问题是 createD() 中的 d.items 是空的,即使在序列化程序中传递数据也是如此。通过我的调试,发现在createB()中遍历c_set时,OrderedDict变空了。 这在 Django 2.2 和 DRF 3.11.x 中肯定运行良好

有其他人遇到过这个问题吗?

感谢您的帮助

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)