【发布时间】:2016-08-25 01:17:45
【问题描述】:
我对 django rest 框架有一点关于泛型关系的问题,该泛型关系也用于 unique_together 约束。
我有这个模型:
class VPC(models.Model):
name = models.SlugField(null=False, max_length=100)
deletable = models.BooleanField(null=False, default=True)
date_created = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Meta:
unique_together = (('name', 'content_type', 'object_id'))
它具有通用关系和唯一约束:vpc 的名称 + 通用关系(即所有者)。
这是序列化程序:
class VPCSerializer(serializers.ModelSerializer):
class Meta:
model = VPC
read_only_fields = ('deletable', 'date_created', 'date_modified')
fields = ('name', 'deletable')
lookup_field = 'name'
validators = [
UniqueTogetherValidator(
queryset=VPC.objects.all(),
fields=('name', 'content_type', 'object_id')
)
]
在字段中我没有放置 content_type 和 object_id,因为我不希望它们被用户显示/设置。
但我必须将它们放在 UniqueTogetherValidator 中,以避免在创建具有相同帐户/名称的 VPC 时出现 django.db.utils.integrityerror 引发的错误。
但现在当我尝试创建 VPC 时出现此错误:
{"object_id":["此字段为必填项。"],"content_type":["此字段为必填项。"]}
所以在我的 viewsets.ModelViewSet 我试图覆盖 perform_create() 设置 object_id 和 content_type 但看起来在调用此方法之前引发了错误。
我也尝试重写 get_serializer_context() 以返回包含 object_id 和 content_type 的字典,但它也不起作用。
我花了很多时间在这上面,但我没有发现。 那么我应该重写什么方法才能在序列化程序中设置 object_id 和 content_type 呢?
谢谢。
【问题讨论】:
标签: python django django-rest-framework