我正在尝试使用更多参数在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"
}
如何将标签保存为列表?
答案 0 :(得分:1)
Django REST Framework忽略了在tags
上tags
字段设置为IncentiveSerializer
时发送的read_only=True
,这意味着无法添加标记,他们只能被阅读。因此,所有标记都被忽略,没有任何东西可以访问数据库。
您可以通过设置read_only=False
来解决此问题,但这需要您在序列化程序上覆盖create
和update
,并且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
找到。您可能需要更改此设置以满足您的要求,因为嵌套对象的创建和更新非常依赖于情境。