【问题标题】:posting a List using Django Rest Frameworks使用 Django Rest 框架发布列表
【发布时间】:2015-12-10 05:20:50
【问题描述】:

刚开始使用 DRF。好奇你们中的一些人在存储列表方面使用了什么方法......我试图实现新添加的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

序列化器.py

class MentionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mention
        fields = ('somekey', 'somenames')

我可以实现的一个选项是将列表存储为单独的表,然后将它们反映在表中,我需要它们用Foreign KeyManyToManyField 嵌套它们。感谢您的任何建议。

【问题讨论】:

  • 这是我不使用 Djangorest 的原因之一。
  • @itsneo 自从我不久前刚开始接触 Django 以来,我假设我会坚持一个基础并检查他们的 Rest 框架工作......你是否使用过任何 python 支持的框架,比如用于构建 api 的 flash restful?我会继续在这里寻找解决方案。
  • 如果你在考虑烧瓶,没有一只猫能打败 Eve 的框架。 python-eve.org/rest_api_for_humans.html 来自意大利的帅哥
  • @itsneo 很酷。会检查出来。似乎它有一些内置的对大量 crud 的支持。谢谢

标签: python django django-rest-framework


【解决方案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

【讨论】:

  • 所以我尝试将其添加到我的模型中,但我收到此错误ListField(child=CharField()) is not JSON serializable
  • ListSerializer,而不是 ListField
  • 啊,错过了。是的,我更正了,同样的错误ListSerializer(child=CharField(default='Username', max_length=140)) is not JSON serializable
  • 好的,我认为问题是另一个问题。我正在更新答案。
  • 我希望我澄清了你的问题
【解决方案2】:

好的,在深入研究 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 中 为列表中的项目创建序列化程序(标签) 对于读/写,您需要定义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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2016-06-10
    • 2021-12-09
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多