如何使用Django Rest Framework保存对象数组

时间:2017-10-22 22:15:24

标签: python django django-rest-framework

我有这个json代码:

{
  "word" : "world",
  "days" : ["tuesday", "thursday"]
}

DRF给了我这个错误:

'days': [{'non_field_errors': ['Invalid data. Expected a dictionary, but got string.']}, 

这是我的日子序列化器:

class DaysSerializer(serializers.ModelSerializer):
    class Meta:
        model = Days
        fields = ('day')

这是我的顶级序列化器:

class WordsSerializer(serializers.ModelSerializer):
    days = DaysSerializer(many=True)
    class Meta:
          model = Words
          fields = ('word', 'days')

Days模型是:

class Days(models.Model):
    DAYS = (
        ("sunday", "Sunday"),
        ("monday", "Monday"),
        ("tuesday", "Tuesday"),
        ("wednesday", "Wednesday"),
        ("thursday", "Thursday"),
        ("friday", "Friday"),
        ("saturday", "Saturday"))

    day = models.TextField(choices=DAYS)

我想强调输入:

"days" : ["tuesday", "thursday"]

的值不是Days表中的键。

我读到我需要使用批量serializers。这是今天推荐的路线吗?或者有一种更简单的方法?

如果我需要使用批量序列化程序库,我不能从他们的示例中了解如何将该库用于我的目的?即(批量)使用其中一个记录(Word)保存多个条目(天)。

P.S。

顺便说一下,天和词之间的关系是M2M而没有through字段。只是简单的M2M

P.S(2)

我对此图像应该有效的方法是DRF会查看Days表,并尝试查找day列等于tuesday的日期并制作M2M。

如果不存在,DRF需要创建记录然后制作M2M。

thursday也是如此。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您尝试将'days'作为主键列表传递,如果案例尝试将序列化程序更改为此表单:

iptables -P FORWARD ACCEPT
uncomment #net.ipv4.ip_forward=1 in /etc/sysctl.conf
sudo sysctl -p
sudo iptables-save

您收到的错误是因为当您使用自己的模型序列化程序来序列化字段时DRF希望默认获取对象列表。您可以在DRF docs中了解有关它的更多信息。

答案 1 :(得分:1)

有多种方法可以表示DRF序列化程序中的关系字段。对于您的特定情况,SlugRelatedField更适合。

class WordsSerializer(serializers.ModelSerializer):
    days = serializers.SlugRelatedField(many=True, slug_field='day`)

    class Meta:
        model = Words
        fields = ('word', 'days')

但请记住

  

当使用SlugRelatedField作为读写字段时,通常需要确保slug字段对应于unique = True的模型字段。