sql - Django查询涉及通用关系的模型
问题描述
这里我有 2 个模型,Company和UserSupervision。Company作为外键与通用关系模型UserSupervision 相关。
我想查询如下:
Company.objects.filter(**{'usersupervision__content_type': Company,
'usersupervision__user': some_user,
'usersupervision__date_cancelled': None})
所以,我想让some_user的所有公司出现在UserSupervision模型中。我知道Company和UserSupervision没有直接关系,所以我想,也许我必须使用带有连接的原始 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)
解决方案
因此,您想在 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,但需要更改公司循环以考虑重复条目。
推荐阅读
- java - 在独立的本地环境中运行 solr start (SOLR 8) 时出现 javax.naming.NoInitialContextException
- angular - 如何测试订阅的价值变化?
- r - 在 rmarkdown 的 ggplot 中为 pdf ( 乳胶 ) 添加希腊字母
- android-studio - 使用 android FFMPEG 库处理有限的视频帧
- excel - 使用 VBA 宏处理然后删除 html/xml 标记
- r - 如何将 RStudio 连接到 OneDrive Excel 文件?
- python - 无法使用 CBV 提交 ModelForm
- google-calendar-api - Google Calender API - 在日历中获取 eventID
- algorithm - 在无向无权图中从第一个顶点返回到自身的长度为 K 的方式数
- c# - 使用 DB2 EF Core 从参数化 SQL 语句返回标量值