我正在尝试实现一个序列化程序,该序列化程序返回一个父记录,其子记录嵌入在响应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命名约定的文档,或者告诉我在字段列表中要更改的内容。谢谢!
答案 0 :(得分:1)
您可能只想尝试将product_id
ForeignKey重命名为product
。
这暗示了它可能被破坏的原因,我怀疑它在模型的序列化程序检查中在模型上product_id
字段的命名中被破坏了。
在模型上定义ForeignKey
时,该字段有两个可用属性。一种是您定义的属性ForeignKey
对象,应该使用它来获取相关的 model 。在后台Django还创建了另一个属性,该属性在外键的名称后附加_id
,该属性表示存储关系的数据库上的IntegerField。如果要在psql中查看表,将看到_id
列(在您的情况下为_id_id
)。