Как сделать выражение объекта Q в этом случае (фильтрация по полю ForeignKey)? - PullRequest
0 голосов
/ 02 октября 2018

models.py:

class Post(models.Model):
    title = models.TextField(max_length=1000, null=True, blank=True, default=None)
    created = models.DateTimeField(auto_now_add=True)


class PostFollow(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)

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

Как это:

user = User.objects.get(pk=1)

not_followed_post = Post.objects.filter(Q(pk__lte=1000) & ~Q(self__is_not_followed_by_user=user))

Как я могу это сделать?

1 Ответ

0 голосов
/ 02 октября 2018

Я думаю, это более самоочевидно при использовании .exclude(..):

not_followed_post = Post.objects.exclude(
    <b>postfollow__user=user</b>
).filter(
    pk__lte=1000
)

. .exclude(..) выполнит универсальное количественное определение прозрачным способом .

Я полагаю, что, вероятно, лучше добавить здесь явные related_name s, чтобы было легче точно определить, где находится отношение.Например:

class PostFollow(models.Model):
    post = models.ForeignKey(
        Post,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        <b>related_name='postfollow'</b>
    )
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        <b>related_name='postfollow'</b>
    )

pk__lte довольно странно.Обычно pk используется только как идентификатор.Создание запросов типа __lte, конечно, возможно, но довольно редко.

Да, pk обычно распределяются в порядке создания (если вы не указали явный), так что если вы никогдаприсвойте явное объяснение, вы, вероятно, могли бы использовать его для получения более свежих записей, чем данная запись.Но все же я думаю, что начинать фильтрацию таким образом немного рискованно.Например, если позже вы добавите исторические данные в базу данных, то они (в зависимости от того, как вы вставляете данные) могут иметь более высокие значения id s и, таким образом, отобразиться в результатах.

...