构造一个连接的django查询

时间:2011-04-05 11:47:34

标签: django django-queryset

我正在与另一个系统上的遗留数据库进行交互,因此这些模型是用石头编写的,而不是非常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密集型)行吗?

2 个答案:

答案 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))