使用DRF的新手。好奇你们有些人使用过什么方法来存储List ....我试图实现新添加的ListField,但我无法让它工作。我使用MySql作为数据库。我认为有一种特定于DRF的方法可以实现这一目标。
例如,假设这是预期的输出:
{
"somenames": ["james", "jim"],
"somekey": "username",
}
models.py
class StringListField(serializers.ListField):
child = serializers.CharField()
class SomeClass(models.Model):
somenames = StringListField,
somekey = models.CharField(max_length=140, default='username')
def publish(self):
self.save()
def __str__(self):
return self.somekey
serializers.py
class MentionSerializer(serializers.ModelSerializer):
class Meta:
model = Mention
fields = ('somekey', 'somenames')
我可以实现的一个选项就是将List作为一个单独的表存储,然后在表格中反映它们,我需要它们将它们嵌套到Foreign Key
或ManyToManyField
中。谢谢你的任何建议。
答案 0 :(得分:1)
我用这个
deep_link = serializers.ListSerializer(child=serializers.CharField())
它基本上是你的捷径。您的代码的问题在于您将模型与序列化程序混淆。模型是数据的数据库表示。该模型未指定序列化程序。序列化程序是来自数据库的模型的序列化表示,主要用于数据传输。
class SomeClass(models.Model):
somenames = StringListField
somekey = models.CharField(max_length=140, default='username')
在这里,你告诉你的模型你的Django模型" somenames"是serializers.ListSerializers类型。那不是你想要的。如果要将模型链接到字符串列表,则需要创建ManyToMany关系或任何所需的关系。下面是一个例子
class Name(models.Model):
name = models.CharField(max_length=100)
class SomeClass(models.Model):
somekey = models.CharField(max_length=100)
somenames = models.ManyToManyField(Names)
然后在你的序列化程序中你会有
class NameSerializer(serializers.ModelSerializer):
name = serializers.CharField()
class SomeClassSerializer(serializers.ModelSerializer):
somenames = NameSerializer(many=True)
somekey = serializers.CharField()
class Meta:
model = SomeClass
答案 1 :(得分:0)
好的,所以在深入研究DRF文档后,在@xbirkettx回答的帮助下,我能够达到我想要的结果:
在models.py中
创建模型。我为父类设置了ForeignKey
关系(在本例中为Mention
类)
class Mention(models.Model):
...
class Hashtag(models.Model):
mention = models.ForeignKey(Mention, related_name='hashtags')
tagname = models.CharField(max_length=100)
class Meta:
unique_together = ('mention', 'tagname')
def __unicode__(self):
return '%s' % (self.tagname)
在serializers.py中的
在列表(Hashtag)中为项目创建序列化程序
对于读/写,您需要定义to_internal_value
方法
class HashListingField(serializers.RelatedField):
def to_internal_value(self, data):
tagname = data
return {
'tagname': tagname
}
def to_representation(self, value):
return value.tagname
确保将queryset
参数添加到序列化程序以进行写访问
class MentionSerializer(serializers.ModelSerializer):
hashtags = HashListingFieldSerializer(many=True, queryset=Hashtag.objects.all())
class Meta:
model = Mention
def create(self, validated_data):
tags_data = validated_data.pop('hashtags')
mention = Mention.objects.create(**validated_data)
for tags_data in tags_data:
Hashtag.objects.create(mention=mention, **tags_data)
return mention