从Djang中的泛型外键获取值

2024-06-11 23:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用一个通用外键定义的模型,如下所示:

class Status(models.Model):
    request_type = models.ForeignKey(ContentType)
    request_id = models.PositiveIntegerField()
    request = GenericForeignKey('request_type', 'request_id')

当我用一个普通的查询集来处理关系时,它工作得很好。在

^{pr2}$

这会正常打印所有的名字。在

不过,我使用的是djangoeztables,它依赖于获取以下值

statuses = Status.objects.all().values('request__name')

但是,当我尝试这个时,我得到:

FieldError: Cannot resolve keyword 'request' into field. Choices are: request_id, request_type, request_type_id

在Django有没有办法做到这一点?在


Tags: 模型idmodel定义关系modelsrequesttype
2条回答

根据the contenttypes framework的文件:

Due to the way GenericForeignKey is implemented, you cannot use such fields directly with filters (filter() and exclude(), for example) via the database API.

由于^{}是这个API的一部分,并且在Aggregations and other QuerySet clauses的文档中仅在filter()/exclude()下面列出了两个部分,我想这就是为什么您的方法失败了。在

我建议这样做:

status_list = Status.objects.all()
statuses = [{'request__name': status.request.name} for status in status_list]

当然,列表理解中的dict键可以是任何你想要的。我把它们留作'request__name',因为如果你的方法能正常工作的话,你就会得到这样的结果。在

我想出来了。在

必须使用以下名称定义对象:

class Status(BaseRequestStatus):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ... more data

然后,在要筛选的对象中,必须创建反向泛型关系:

^{pr2}$

最后你可以做一些有趣的事情

statuses = Status.objects.all().values('request__name')

或者

Status.objects.filter(request__name__contains="stack overflow")

相关问题 更多 >