Набор запросов Django с аргументом isnull, возвращающим дубликаты - PullRequest
4 голосов
/ 08 мая 2011

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

class Post(models.Model):
     ....fields


class Photo(models.Model):
    post=models.ForeignKey(Post,blank=True,null=True)
    photo=models.FileField(upload_to="pics")    


    def __unicode__(self):
        return str(self.post)

Я собрал следующий запрос, чтобы вернуть экземпляры Post, для которых фотография не равна нулю:

    posts=Post.objects.filter(photo__photo__isnull=False)

Проблема в том, что он возвращает несколько копийкаждый экземпляр Post на количество экземпляров Photo, связанных с экземпляром Post.Другими словами, в одном сообщении есть 5 фотографий, и поэтому он возвращает пять копий в наборе запросов.Я просмотрел документацию, и это немного сложно.В конечном итоге я использую Different (), но я предполагаю, что я могу заставить его работать сразу.

Спасибо

Ответы [ 2 ]

8 голосов
/ 08 мая 2011

Чтобы вернуть сообщения, которые не имеют связанных фотографий, используйте следующий запрос:

posts=Post.objects.filter(photo__isnull=True)

Позже в своем вопросе вы используете isnull=False. Как вы говорите, результирующий набор запросов будет возвращать каждое сообщение один раз для каждой фотографии, которая к нему прикреплена. Чтобы включить каждый пост только один раз в набор запросов, используйте отдельный.

posts=Post.objects.filter(photo__isnull=False).distinct()

Я не уверен, почему вы запрашиваете photo__photo__isnull в своем запросе - Мой ответ предполагает, что вы должны использовать photo__isnull.

1 голос
/ 08 мая 2011

Я не уверен, что вы подразумеваете под ", но я предполагаю, что смогу заставить его работать сразу", но использование различных () или order_by () должно решить вашу проблему.

...