首页 > 解决方案 > 我想将 JSON 值列表发布到 Django 中的模型字段

问题描述

我想将电影发布到集合的电影字段(电影列表)中。我将模型定义为

class Movie(models.Model):
    # collection = models.ForeignKey(Collection, on_delete = models.CASCADE) #, related_name='reviews'
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    genres = models.CharField(max_length=200)
    uuid = models.CharField(max_length=200)
    def __str__(self):
        return self.title

class Collection(models.Model):
    title = models.CharField(max_length=200)
    uuid = models.CharField(max_length=200, primary_key = True)
    description = models.CharField(max_length=200)
    movie = models.ForeignKey(Movie, on_delete = models.CASCADE)

    def __str__(self): 
        return self.title

这就是我使用视图集的方式

class CollectionViewSet(viewsets.ModelViewSet):
    queryset = models.Collection.objects.all()
    serializer_class = serializers.CollectionSerializer

但我无法为电影字段输入值 在 此处输入图像描述

也是我的序列化器

class CollectionSerializer(serializers.ModelSerializer):
     class Meta:
        model = Collection
        fields = '__all__'

标签: djangodjango-rest-framework

解决方案


默认情况下,DRF 将表示与 a 的关系PrimaryKeyRelatedField,因此需要一个电影 ID。

为了实现你想要的(创建一个带有集合的电影实例),你需要用你自己的电影序列化器覆盖序列化器中的外键字段。

class MovieSerializer(serializers.ModelSerializer):
     class Meta:
        model = Movie
        fields = '__all__'

class CollectionSerializer(serializers.ModelSerializer):
     movie = MovieSerializer()
     class Meta:
        model = Collection
        fields = '__all__'

     def create(self, validated_data):
         movie = validated_data.pop('movie')
         movie = Movie .objects.create(**movie )
         collection = Collection.objects.create(movie=movie, **validated_data)
         return collection

您需要覆盖 create 方法,以便在创建 Collection 时还创建电影。

但是,我不确定在您的模型中是否在正确的模型中设置了外键。(一部电影属于许多集合,但不是相反?)如果这不是你想要的,只需反转序列化程序的逻辑。

编辑:

发送以下内容应该可以正常工作:

{ "uuid": "1001",
  "title": "Action", 
  "description": "Action Movies",
  "movie": { "title": "The Burkittsville 7",
             "description": "The story of Rustin Parr.",
             "genres": "Horror",
             "uuid": "5e904"
            }
 } 

正如我之前提到的,唯一的问题是在您的模型中,您在集合中定义了外键字段。所以它需要一个电影实例而不是一个列表,因此我去掉了你放在电影周围的括号。也许您应该考虑在 Movie 模型中设置外键,或者使用多对多关系。


推荐阅读