2

对 Django GenericRelations 的过滤已在 4 年前通过https://code.djangoproject.com/ticket/22207实现,现在支持从相关模型中过滤:

class Issue(models.Model):
    project_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=False, null=True)
    project_id = models.PositiveIntegerField(blank=False, null=True)
    project = GenericForeignKey('project_content_type', 'project_id')

class GitlabProject(models.Model):
    issues = GenericRelation(
        Issue,
        related_query_name='generic_project',
        content_type_field='project_content_type',
        object_id_field='project_id',
)

接着:

issues = queryset.filter(generic_project__offers__members__in=[request.user])

我们不能只使用project__offers_members- 它会失败,因为 Django 不会反向解析通用外键。

但是,如果我们有另一个具有相同的项目模型会发生什么related_query_name

class JiraProject(models.Model):
    issues = GenericRelation(
        Issue,
        related_query_name='generic_project',
        content_type_field='project_content_type',
        object_id_field='project_id',
)

我尝试在所有不同的模型(即 Gitlab 项目、Jira 项目等)上设置GenericRelation相同的值。然而,这导致 Django 只选择“第一个”项目模型。与所有后续项目模型的通用关系被忽略,因此,具有不属于“第一个”项目模型的实例集的问题将被忽略,而不是查询集的一部分。related_query_nameproject

related_query_name我认为当多个 GenericRelations 具有相同的值集时,Django 应该支持这一点或发出警告或错误(可能在执行 makemigrations 命令时) 。

一个过滤器如何有效地过滤issuesproject属性设置为不同模型的实例?

4

0 回答 0