我有一个使用Django内容类型框架的模型
class Foo(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT)
object_id = models.UUIDField()
contentObject = GenericForeignKey()
然后我使用modelViewSet和序列化器
class FooViewSet(viewsets.ModelViewSet):
serializer_class = FooSerializer
queryset = Foo.objects.all()
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
fields = ('__all__')
如何使用POST到viewSet创建数据?
我任意尝试将来自另一个模型的对象ID POST到content_type
,object_id
和content_object
,然后出现错误“类型错误。期望的pk值,收到了str”。
我已经查看过http://www.django-rest-framework.org/api-guide/relations/#generic-relationships或堆栈溢出,但是找不到有关如何发布数据的任何信息,很抱歉,我的搜索不够彻底。感谢您检查我的问题
更新
我尝试覆盖序列化器中的create方法:
我尝试从get_for_model
方法获取ContentType对象,但是它返回AttributeError:'AnotherModelX'对象没有属性'replace'
def create(self, validated_data):
content_type = validated_data.get("object_id")
taggedObject = AnotherObject1.objects.get(id=content_type) if AnotherObject1.objects.filter(id=content_type).count() > 0 else None
taggedObject = AnotherObject2.objects.get(id=content_type) if AnotherObject2.objects.filter(id=content_type).count() > 0 and taggedObject == None else None
if taggedObject is not None:
contentType = ContentType.objects.get_for_model(taggedObject)
if contentType is not None:
validated_data["content_type"] = contentType
validated_data["object_id"] = taggedObject
return super(FooSerializer, self).create(validated_data)
class Meta:
model = Foo
fields = ('__all__')
extra_kwargs = {
'content_type': {'required': False},
答案 0 :(得分:0)
证明我最近的更新接近解决方案,
它应该在<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css">
中分配一个ID,然后它就可以工作了。这是validated_data["object_id]
的POST json数据:
Foo
请确保获取所有可能的模型,以便{
"object_id": <<another_model_uuid>>
}
包含模型的实例。
现在解决了,谢谢!
贝洛是串行器中正确的taggedObject
方法
create