使用Django Rest框架发布列表

时间:2015-12-10 05:20:50

标签: python django django-rest-framework

使用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 KeyManyToManyField中。谢谢你的任何建议。

2 个答案:

答案 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