【问题标题】:DRF POST object with FK带有 FK 的 DRF POST 对象
【发布时间】:2016-09-29 06:56:18
【问题描述】:

首先,我的模型

class Director(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

class Movie(models.Model):
    title = models.CharField(max_length=150, unique=True)
    director = models.ForeignKey(Director, related_name="movies")

我想发布 json 文件来创建一个导演、一个有电影的导演(一次)或一部电影。

所以,这是我的序列化程序

class MovieSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    url = HyperlinkedIdentityField(view_name='movie')
    class Meta:
        model = Movie
        exclude = ('director', )  # edit (solution) this line is the problem. It does not only affect the representation... Just remove that and it's OK


class DirectorSerializer(serializers.ModelSerializer):
    movies = MovieSerializer(many=True)

    class Meta:
        model = Director
        fields = '__all__'


    def create(self, validated_data):
        movies = validated_data.pop('movies')
        director = self.Meta.model.objects.create(**validated_data)

        for movie in movies:
            Movie.objects.create(director=director, **movie)

        return director

所以,(感谢 httpie),创建一个新的导演:

{
    "first_name": "Christopher",
    "last_name": "Nolan",
    "movies": []
}

工作正常。 用电影创建新导演:

{
    "first_name": "Luc",
    "last_name": "Besson",
    "movies": [
        {
            "title": "Le Grand Bleu"
        }
    ]
}

也可以。 但我无法添加新电影 创建新电影。 JSON:

{
    "title": "Interstellar",
    "director": 1
}

导演 id = 1 => C. Nolan ;-)

我想我错过了一些东西,所以如果有人可以帮助我、给我建议或其他什么?

谢谢,问候

编辑问题是:

我必须 POST 什么 JSON 文件才能将“星际”电影添加到诺兰的电影 (id_director=1)?

【问题讨论】:

  • 您使用的是什么类型的请求和哪个端点?
  • 你用过Django的批量创建吗,如果没有请看这个链接:docs.djangoproject.com/en/1.9/ref/models/querysets/#bulk-create
  • @zymud 请求类型 ?? : json 数据通过 http 使用 POST 动词(这就是你想知道的:/?)。 Endpoint ?? 在数据库中创建一个新的movie我不确定您的问题...抱歉。
  • @ChitrankDixit :我查看了 querysets/bulk_create 文档。但我不知道它对我有什么帮助?...

标签: python json django django-rest-framework


【解决方案1】:

您无法在此处添加新电影,因为您已在 MovieSerializer 中排除了 director 字段。但是导演字段是电影模型所必需的。删除排除应该可以工作

【讨论】:

  • 该死的!我这样做是为了很好地代表 REST 主管列表。也许您知道该怎么做,我的意思是,不要重复导演列表中的导演 id[ {"id": 1, "name": "C. Nolan", "movies": [{"title": "Interstellar", "director": 1}]}] ?非常感谢你。
  • 将director字段设为write_only可以吗?但是如果你有一个 /movies/ 端点,你就不会在那里拥有导演数据。否则,您可以覆盖 MovieSerializer 的 to_representation 以从电影数据中删除导演详细信息
  • 事实上,我想我想要 Movie 对象的 2 种不同表示。所以 2 个序列化器...
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多