Django帖子列表json

时间:2015-01-01 14:40:47

标签: python django django-rest-framework

我正在尝试使用更多参数在JSON中发送列表。所有参数都有效,但不是列表,列表保存为空列表。我正在使用Django REST Framework和嵌套的序列化器。

这是我的serializers.py

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ('tagID', 'tagName')

class IncentiveSerializer(serializers.ModelSerializer):
    tags=TagSerializer(many=True,read_only=True)
    class Meta:
        model = Incentive
        fields = ('schemeName', 'schemeID','text','typeID','typeName','status','ordinal','tags','modeID',
        'groupIncentive','condition')

这是我的models.py

class Incentive(models.Model):
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    ... more fields ....
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    #email = models.TextField()

    class Meta:
        ordering = ('created',)

    def save(self, *args, **kwargs):
        """
        Use the `pygments` library to create a highlighted HTML
        representation of the code snippet.
        """
        lexer = get_lexer_by_name(self.language)
        options = self.schemeName and {'title': self.schemeName} or {}
        formatter = HtmlFormatter(text=self.text,
                              full=True, **options)
        self.highlighted = highlight(self.schemeName, lexer, formatter)
        super(Incentive, self).save(*args, **kwargs)


class Tag(models.Model):
    incentiveID = models.ForeignKey(Incentive,related_name="tags")
    tagID= models.IntegerField()
    tagName = models.CharField(max_length=100, blank=True, default='')

    class Meta:
        unique_together = ('incentiveID', 'tagID')

    def save(self, *args, **kwargs):
        super(Tag, self).save(*args, **kwargs)

    def __unicode__(self):
         return '%d: %s' % (self.tagID, self.tagName)

我发送此信息为JSON

{
    "schemeName": "SendEmails", 
    "schemeID": 1234, 
    "text": "HelloWorld", 
    "typeID": 345, 
    "typeName": "Emails", 
    "status": true, 
    "ordinal": 0, 
    "tags": [{"tagID":123,"tagName":"dor"}], 
    "modeID": 0, 
    "groupIncentive": false, 
    "condition": "SendEmails"
}

我从服务器返回的结果是

{
    "schemeName": "SendEmails", 
    "schemeID": 1234, 
    "text": "HelloWorld", 
    "typeID": 345, 
    "typeName": "Emails", 
    "status": true, 
    "ordinal": 0, 
    "tags": [], 
    "modeID": 0, 
    "groupIncentive": false, 
    "condition": "SendEmails"
}

如何将标签保存为列表?

1 个答案:

答案 0 :(得分:1)

Django REST Framework忽略了在tagstags字段设置为IncentiveSerializer时发送的read_only=True,这意味着无法添加标记,他们只能被阅读。因此,所有标记都被忽略,没有任何东西可以访问数据库。

您可以通过设置read_only=False来解决此问题,但这需要您在序列化程序上覆盖createupdate,并且DRF 3默认情况下不处理嵌套序列化程序。 Django REST Framework文档有some useful information以通用方式实现这些方法,但它很可能是特定于序列化器的。

class IncentiveSerializer(serializers.ModelSerializer):
    tags=TagSerializer(many=True,  read_only=False)

    class Meta:
        model = Incentive
        fields = ('schemeName', 'schemeID','text','typeID','typeName','status','ordinal','tags','modeID',
        'groupIncentive','condition')

    def create(self, validated_data):
        tags_data = validated_data.pop("tags", [])

        # Ignores tags without a tagId
        tags_ids = [tag["tagId"] for tag in tags_data if "tagId" in tag]

        incentive = super(IncentiveSerializer, self).create(validated_data)

        if tags_ids:
            tags = Tag.objects.filter(tagId__in=tags_ids)
            incentive.tags.add(*tags)

        return incentive

这应该允许您在创建tags时添加Incentive,但它要求标记已存在且可由tagId找到。您可能需要更改此设置以满足您的要求,因为嵌套对象的创建和更新非常依赖于情境。