Django: сделать запрос с ограничениями на связанные модели - PullRequest
1 голос
/ 19 декабря 2010

Пример кода

class Person(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    author = models.ForeignKey(Person)
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post)
    author = models.ForeignKey(Person)
    content = models.TextField()


foo = Person.objects.create(name='foo')
bar = Person.objects.create(name='bar')

blog = Post.objects.create(author=foo,content='Random Blog 1')
blog2 = Post.objects.create(author=foo, content='Radom Blog 2')

c1 = Comment.objects.create(post=blog, author=foo, content='Comment on blog1')
c2 = Comment.objects.create(post=blog, author=bar, content='Bar comment on blog1')
c3 = Comment.objects.create(post=blog2, author=foo, content='Comment on blog2')
c4 = Comment.objects.create(post=blog2, author=bar, content='Bar comment on blog2')

Как сделать запрос, который возвращает все сообщения с автором foo, и только комментарии в наборе комментариев каждого сообщения также создаются foo.

1 Ответ

0 голосов
/ 19 декабря 2010

Я бы, наверное, пошел с чем-то вроде этого:

    from django.db.models import Count, F

    Post.objects.filter(author=foo
        ).annotate(comment_count=Count('comment_set')
        ).filter(comment_set__author=foo #
        ).annotate(foo_comment_count=Count('comment_set')
        ).filter(foo_comment_count=F('comment_count')))

Другим подходом может быть подзапрос, чтобы выбрать сообщения, которые были прокомментированы кем-то другим, затем foo, а затем выбрать все с PK, не входящим в этот набор.

Написание запросов с использованием ORM Джанго не сильно отличается от написания SQL-запросов. В крайнем случае, вы всегда можете написать необработанный запрос .

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