首页 > 解决方案 > Django查询涉及通用关系的模型

问题描述

这里我有 2 个模型,CompanyUserSupervisionCompany作为外键与通用关系模型UserSupervision 相关

我想查询如下:

Company.objects.filter(**{'usersupervision__content_type': Company,
                          'usersupervision__user': some_user,
                          'usersupervision__date_cancelled': None})

所以,我想让some_user的所有公司出现在UserSupervision模型中。我知道CompanyUserSupervision没有直接关系,所以我想,也许我必须使用带有连接的原始 sql?还是其他更合适的解决方案?

class Company(models.Model):
    id = models.UUIDField(blank=True, editable=False, primary_key=True, default=uuid.uuid4)
    name = models.CharField(max_length=150, unique=True)

    users = models.ManyToManyField(User, related_name='companies', through='CompanyMembership')
    date_created = models.DateTimeField('created date', blank=True, editable=False, auto_now_add=True)
    date_updated = models.DateTimeField('updated date', blank=True, editable=False, auto_now=True)


class UserSupervision(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    supervision = models.ForeignKey(Supervision, on_delete=models.SET_NULL, null=True)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.UUIDField()
    content_object = GenericForeignKey()

    date_assigned = models.DateTimeField('assigned date', blank=True, editable=False, auto_now_add=True)
    date_cancelled = models.DateTimeField('cancelled date', blank=True, null=True, default=None)

标签: sqldjangodjango-modelsquerying

解决方案


因此,您想在 UserSupervision 中查找某个特定 UserSupervision.user 的所有公司?就像是:

user_supervisions = UserSupervision.objects.filter(
    content_type=ContentType.objects.get_for_model(Company),
    user=some_user,
    date_cancelled=None
).order_by('content_type_id', 'object_id').distinct('content_type_id', 'object_id')

companies = [us.object_id for us in usersupervisions]  # Loop to create list of company ids.

如果您不使用 PostgreSQL,则可以删除 order_by 和 distinct,但需要更改公司循环以考虑重复条目。


推荐阅读