сложный запрос в Django, где существует подзапрос - PullRequest
1 голос
/ 09 сентября 2011

У меня есть таблица с множеством записей, и я пытаюсь создать сложный запрос и надеюсь, что здесь вам помогут.

models.py

class Vote(models.Model):
    is_annonymous   = models.BooleanField(default=True)
    vote            = models.IntegerField()

    created_by        = models.ForeignKey(User, null=True, blank=True)
    created_at        = models.DateTimeField(null=True, blank=True)
    ip_address        = models.IPAddressField(null=True, blank=True)


    #content type
    content_type    = models.ForeignKey(ContentType)
    object_id       = models.PositiveIntegerField()
    content_object  = generic.GenericForeignKey('content_type', 'object_id')

запрос

all_votes = Vote.objects.filter(
    ~Q(created_by   = None),
)

Пытаюсь вернуть записи из голосования, в которых не указано значение null и первый голос создан. Это означает, что я хочу вернуть запись голосования только в том случае, если пользователь сделал свой первый голос.

Не уверен, как это сделать, обычно на SQL, мне нужно будет выполнить подзапрос и подсчитать голоса пользователей, и если они равны единице, вернуть запись.

Есть идеи, как мне это сделать с моделями Django?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2011

попробуйте присоединиться к голосованию оставьте заявку на голосование on left_vote.created_by==right_vote.created_by and left_vote.id!=right_vote.id и отфильтруйте записи с нулевыми значениями справа от объединения.

0 голосов
/ 10 сентября 2011

Вы можете сделать это с помощью комбинации методов .values и .aggregate.

from django.db.models import Q, Min
votes = Vote.objects.filter(~Q(created_by=None).values('created_by').aggregate(min=Min('created_at'))

Если у вас есть это, если вы хотите получить фактические Vote экземпляров , вам нужно будет сделать еще один запрос и использовать идентификаторы, возвращенные выше.

Дополнительную информацию см. В разделе справки Django по агрегату и значениям .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...