当前位置: 首页 > 知识库问答 >
问题:

GenericForeignKey, ContentType和DjangoRestframe

巫马玉堂
2023-03-14

我正在Django中开发一个讨论应用程序,它有线程,帖子,回复和投票。投票使用通用外键和内容类型来确保用户只能在特定的线程/帖子/回复上投票一次。

投票模型看起来像这样:

VOTE_TYPE = (
    (-1, 'DISLIKE'),
    (1, 'LIKE'),
)

class Vote(models.Model):
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType,
        limit_choices_to={"model__in": ("Thread", "Reply", "Post")}, 
        related_name="votes")
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    vote = models.IntegerField(choices=VOTE_TYPE)

    objects = GetOrNoneManager()

    class Meta():
        unique_together = [('object_id', 'content_type', 'user')]

投票序列化程序:

class VoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vote

处理投票的观点:

@api_view(['POST'])
def discussions_vote(request):

if not request.user.is_authenticated():
    return Response(status=status.HTTP_404_NOT_FOUND)

data = request.DATA

if data['obj_type'] == 'thread':
    content_type = ContentType.objects.get_for_model(Thread)

    print content_type.id

    info = {
        'content_type': content_type.id,
        'user': request.user.id,
        'object_id': data['obj']['id']
    }

    vote = Vote.objects.get_or_none(**info)

    info['vote'] = data['vote']

    ser = VoteSerializer(vote, data=info)

    if ser.is_valid():
        print "Valid"
    else:
        pprint.pprint(ser.errors)

return Response()

请求。数据内容:

{u'vote': -1, 
u'obj_type': u'thread', 
u'obj': 
    {
    ...
    u'id': 7, 
    ...
    }
}

当我投票时,Django Rest Framework序列化程序抛出一个错误:

Model content type with pk 149 does not exist.  

149是线程模型的ContentType的正确id,根据

print content_type.id

我几乎不知道是什么导致了这一切。。。

共有1个答案

笪建章
2023-03-14

问题可能是其中有一个通用外键,它可以链接到任何类型的模型实例,因此REST框架没有确定如何表示序列化数据的默认方式。

看看这里的序列化程序中GFK上的文档,希望它能帮助您开始。。。http://www.django-rest-framework.org/api-guide/relations#generic-关系

如果您仍然发现它有问题,那么只需完全停止使用序列化程序,只需在视图中显式执行验证,并返回您希望用于表示的任何值的字典。

 类似资料:
  • 我对django rest框架有一个关于泛型关系的小问题,这个泛型关系也用于唯一的约束。 我有这个模型: 它有一个通用关系和一个唯一的约束:专有网络的名称和通用关系(即所有者)。 以下是序列化程序: 在字段中,我不把content_type和object_id,因为我不想让用户显示/设置它们。 但是,我必须把它们放在UniqueTobetherValidator中,以避免在创建具有相同帐户/名称的

  • 我有一个模型,它使用一个通用外键,使用“content\u type”字段来存储内容类型,“object\u id”来存储对象id。这个模型需要使用CRUD API进行操作,我使用的是DRF。我有一个模型的序列化程序,但我遇到了一点问题。如果我只是将content\u type添加到如下字段列表中 序列化程序将JSON表示设置为ContentType模型实例的ID。API的用户不知道这些ID,我不

  • 我有以下Jquery回调函数,我对它有一点怀疑(我不太了解Jquery): 如您所见,该函数只需向后端执行一个AJAX请求,为该请求设置参数。 数据类型呢?什么说?我在HTTP请求中发送的数据类型? 在这种情况下是“text”,因为我发送的是一个文本字符串,它呈现了XML代码?

  • 问题内容: 我正在尝试确保来自基于Jersey的Java应用程序的所有JSON响应均在其ContentType标头中附加了UTF-8字符编码参数。 所以,如果它是一个JSON响应,我想响应报头的要 内容类型:application / json; charset = UTF-8 如果无论内容类型如何,我都尝试在过滤器中设置字符编码,则效果很好。但是我只想在ContentType为“ applica

  • 问题内容: 我有以下Jquery回调函数,对此我有点怀疑(我不太了解Jquery): 如您所见,该函数只需向后端执行AJAX请求,并为此请求设置参数即可。 我已设置为将请求发送到URL,该请求是POST请求,并且要发送的数据为以下字符串: “ barapple” 我很难理解 contentType* 和 dataType有 什么区别 * 我认为 contentType 指定了HTTP响应中可接受的

  • 问题内容: 有没有办法告诉Django,具有内容类型GenericForeignKey的模型只能指向预定义列表中的模型?例如,我有4个模型:A,B,C,D和一个拥有GenericForeignKey的模型X。我可以告诉X GenericForeignKey只允许A和B吗? 问题答案: 例如,你的应用是app和app2,并且app中有A,B模型,而app2中有C,D模型。你只想查看app.A和app