Django RestFramework-具有数据库视图的父子模型序列化器?

时间:2019-05-25 02:07:17

标签: django serialization django-rest-framework

我正在尝试实现一个序列化程序,该序列化程序返回一个父记录,其子记录嵌入在响应json对象中。

我的父级和子级模型均基于数据库视图:

class ProductContributorView(models.Model):  # its a model of a view
   id = models.IntegerField(primary_key=True)
   product_id = models.ForeignKey('ProductTitleView', on_delete=models.DO_NOTHING, related_name='contributors')
   sequenceNumber = models.IntegerField()
   name = models.CharField(max_length=180)
   role = models.CharField(max_length=8, null=True)
   description = models.CharField(max_length=1408)

   class Meta:
      managed = False  
      ordering = ['sequenceNumber',]


class ProductTitleView(models.Model):
   id = models.IntegerField(primary_key=True)
   isbn = models.CharField(max_length=80)
   titleText = models.CharField(max_length=300)

   class Meta:
      managed = False  
      ordering = ['titleText', 'isbn',]

以下是序列化器:

class ProductContributorViewSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = ProductContributorView
        fields = ('id', 'product_id', 'sequenceNumber', 'name', 'role', 'description')

    def create(self, validated_data):
        contributor = ProductContributorView.objects.create(
            id=validated_data['id'],
            product_id=validated_data['product_id'],
            sequenceNumber=validated_data['sequenceNumber'],
            name=validated_data['name'],
            role=validated_data['role'],
            description=validated_data['description'])
        return contributor


class ProductTitleViewSerializer(serializers.HyperlinkedModelSerializer):

    contributors = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = ProductTitleView
        fields = ('id', 'isbn', 'titleText', 'contributors')

以下是视图:

class ProductTitleViewList(generics.ListAPIView):
    queryset = ProductTitleView.objects.all()
    serializer_class = ProductTitleViewSerializer

class ProductContributorViewList(generics.ListAPIView):
    queryset = ProductContributorView.objects.all()
    serializer_class = ProductContributorViewSerializer

基本思想是让贡献者(作者,插图画家等)以与ProductTitleView中的ID相匹配的ProductContributorView视图中的FK返回书名。

但是,运行此命令时,出现以下错误:

1054, "Unknown column 'jester_productcontributorview.product_id_id' in 'field list'"

我没有在字段列表中指定product_id_id,并且我还尝试将字段仅作为产品在字段列表中引用,但它仍然重复_id_id后缀。希望有人将我带到说明FK命名约定的文档,或者告诉我在字段列表中要更改的内容。谢谢!

1 个答案:

答案 0 :(得分:1)

您可能只想尝试将product_id ForeignKey重命名为product

这暗示了它可能被破坏的原因,我怀疑它在模型的序列化程序检查中在模型上product_id字段的命名中被破坏了。

在模型上定义ForeignKey时,该字段有两个可用属性。一种是您定义的属性ForeignKey对象,应该使用它来获取相关的 model 。在后台Django还创建了另一个属性,该属性在外键的名称后附加_id,该属性表示存储关系的数据库上的IntegerField。如果要在psql中查看表,将看到_id列(在您的情况下为_id_id)。