【问题标题】:Django-rest :send POST request with 2 foreign keyDjango-rest:使用 2 个外键发送 POST 请求
【发布时间】:2020-02-15 10:02:54
【问题描述】:

我想在具有 2 个外键的序列化程序中发布数据。
我有这些模型:

class Child(models.Model):
    first_name = models.CharField(max_length=40)
    description = models.CharField(max_length=40)

class Parent(models.Model):
    name = models.CharField(max_length=20)
    pet = models.ForeignKey(pet)
    child = models.ForeignKey(Child, related_name='boys')

class Pet(models.Model):
    kind = models.CharField(max_length=40)
------------------,
Class PetSerializer(ModelSerializer):
    class Meta:
        model = Pet
        fields = ('kind',)

class ParentSerializer(ModelSerializer):    
    pet = PetSerializer(many=True): 
    class Meta:
        model = Parent
        fields = ('name', 'pet')

class ChildSerializer(ModelSerializer):
    boys = ParentSerializer() 

    class Meta:
        model = Child
        fields = ('first_name', 'boys')

我的第一个问题:是否可以得到输出:

{
    "first_name": "Peter",
    "boys": [
      {
        "name": "Bill",
         "kind": "dog"
        }
      ]
   }

我的第二个问题:我正在尝试使用这种方法发送数据以创建新模型:




    def create(self, validated_data):
        clean_data = validated_data.pop('boys')
        child = Child.objects.create(**validated_data)
        for data in clean_data:
            Parent.objects.create(child=child, **data)
        return child
But I got this error: TypeError: Direct assignment to the reverse side of a related set is prohibited. Use boys.set() instead.

【问题讨论】:

  • boysChild 模型的外键吗?
  • boys is the related_name :attribute 指定从 Child 模型回到 Parent 模型的反向关系的名称。
  • 对于您的第二个问题,请提供您的validated_data 并检查您关于tracks_data 变量的代码。错误中的username 也在哪里。请把你的第二个问题说清楚。
  • 对不起。是boys.set()

标签: serialization django-rest-framework foreign-keys django-rest-viewsets


【解决方案1】:

仅针对您的第一个问题,您可以在 ParentSerializer 类中使用 source parameter

class ParentSerializer(ModelSerializer):    
    kind = serializers.CharField(source='pet.kind'): 
    class Meta:
        model = Parent
        fields = ('name', 'kind')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2018-07-20
    • 2018-07-07
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多