我正在与另一个系统上的遗留数据库进行交互,因此这些模型是用石头编写的,而不是非常django-ey。
我的models.py
:
class Site(models.Model):
site_code = models.CharField(max_length=30, primary_key=True)
name = models.CharField(unique=True, max_length=300)
class Document(models.Model):
id = models.IntegerField(primary_key=True)
site_ref = models.ForeignKey(Site)
description = models.CharField(max_length=1500)
class DocumentStatusCategory(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(unique=True, max_length=90)
class DocumentStatus(models.Model):
id = models.IntegerField(primary_key=True)
document = models.ForeignKey(Document)
status = models.ForeignKey(DocumentStatusCategory)
changed_by = models.ForeignKey(User)
created_at = models.DateTimeField()
在我的views.py
中,我想要检索一个查询集,其中包含属于指定Document
(例如Site
)的所有site_ref=mysite
个对象,这些对象执行不< / strong>与DocumentStatus
有任何相关的status=4
个对象。
我知道如何将其作为单个(非sql密集型)行吗?
答案 0 :(得分:2)
Document.objects.filter(site_ref=mysite).exclude(documentstatus__status_id=4)
答案 1 :(得分:1)
Document.objects.filter(site_ref=site_obj).exclude(documentstatus_set__in=DocumentStatus.objects.filter(status_id=4))
不完全是一个查询,但我认为如果没有原始的sql,这是可以实现的。我想,有两个问题不错。
我应该提一下,上面假设Document和DocumentStatus之间的反向关系是documentstatus_set
。您可以明确说明反向关系是什么样的:
# inside the DocumentStatus model definition
document = models.ForeignKey(Document, related_name='document_statuses')
然后查询变为:
Document.objects.filter(site_ref=site_obj).exclude(document_statuses__in=DocumentStatus.objects.filter(status_id=4))