如何过帐到具有GenericForeignKey的modelViewSet?

时间:2018-07-03 08:58:19

标签: django-rest-framework django-contenttypes

我有一个使用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_typeobject_idcontent_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},

1 个答案:

答案 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