построение объединенного запроса Django - PullRequest
1 голос
/ 05 апреля 2011

Я взаимодействую с устаревшей базой данных в другой системе, поэтому модели написаны на камне и не очень django-ey.

My 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()

Inmy views.py Я хочу получить набор запросов со всеми Document объектами, которые принадлежат указанному Site (скажем site_ref=mysite), которые не имеют какие-либо связанные DocumentStatus объекты с status=4.

Любая идея, как я могу сделать это в виде одной (не SQL-интенсивной) строки?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011
Document.objects.filter(site_ref=mysite).exclude(documentstatus__status_id=4)
1 голос
/ 05 апреля 2011
Document.objects.filter(site_ref=site_obj).exclude(documentstatus_set__in=DocumentStatus.objects.filter(status_id=4))

Не совсем один запрос, но я не думаю, что это выполнимо без перехода на raw 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...