【问题标题】:Django: insert data into table which contains foregin key and many to many relation using serializerDjango:使用序列化程序将数据插入包含外键和多对多关系的表中
【发布时间】:2021-02-19 12:58:44
【问题描述】:

我有一个包含多对多和外键关系的表

class TableRelation(models.Model):
    table1 = models.ForeignKey(table1, on_delete=models.CASCADE)
    table2 = models.ForeignKey(table2, on_delete=models.CASCADE)
    table3 = models.ManyToManyField(table3)

iam 使用 mixins 和通用视图集来列出和更新。列表检索工作正常。但是当我更新或创建它时显示 AssertionError:.create() 方法默认不支持可写嵌套字段。 为序列化器table1.serializers.TableRelationSerializer 编写显式.create() 方法,或在嵌套的序列化器字段上设置read_only=True。 所以我在序列化器中写了一个创建方法

class TableRelationSerializer(serializers.ModelSerializer):
    table1 = Table1Serializer()
    table2 = Table2Serializer()
    table3 = Table3Serializer(many=True)
    class Meta:
        model = TableRelation
        fields = ('id', 'table1', 'table2', 'table3',)
    def create(self, instance, validated_data):
        remove_table1 = validated_data.pop('table1',)
        remove_table2 = remove_table1.pop('table2')
        table_data = remove_table2.pop('table3')
        table1 = Table1.objects.create(**validated_data)
        table2 = Table2.objects.create(**validated_data)
        table3 = Table3.objects.create(**validated_data)
        TableRelation.objects.create(
            table1=table1, table2=table2, table3=table3, **table_data)
        return "fhfh"

然后我得到这个错误 类型错误:create() 缺少 1 个必需的位置参数:'validated_data' 我尝试了其他一些方法然后我也收到了这个错误 在包含表的多对多和外键列中创建实例的正确方法是什么?

【问题讨论】:

  • 尝试从 create 方法中删除实例并返回 {} 而不是字符串
  • 删除实例后,错误消失了。谢谢。我写创建方法的方式是写?因为无法创建

标签: django django-rest-framework many-to-many django-serializer


【解决方案1】:

感谢 VJ Magar 的评论。这帮助我消除了 create() 缺失错误。 我发现了如何使用序列化程序将数据插入到包含外键和许多关系的表中

class TableRelationSerializer(serializers.ModelSerializer):
    table1 = Table1Serializer(read_only=True)
    table1_id = serializers.PrimaryKeyRelatedField(
        queryset=table1.objects.all(), write_only=True)
    table2 = Table2Serializer(read_only=True)
    table2_id = serializers.PrimaryKeyRelatedField(
        queryset=Table2.objects.all(), write_only=True)
    table3_type = Table3Serializer(read_only=True, many=True)
    table3_id = serializers.PrimaryKeyRelatedField(
        queryset=Table3.objects.all(), write_only=True, many=True)
   def create(self, validated_data):
        data1 = validated_data.pop('table1_id')
        data2 = validated_data.pop('table2_id')
        data3 = validated_data.pop('table3_id')
        table_role = TableRelation.objects.create(
            table1_id=data1.id, table2_id=data2.id,  **validated_data)
        for table in data3:
            table_role.table3.add(table)
        return table_role

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多