как получить только результаты во многих отношениях со многими в Джанго - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующие отношения:

class Customer(models.Model):  
    user = models.OneToOneField(User, on_delete=models.CASCADE)  

class Post(models.Model):  
    customer = models.ForeignKey('common.Customer', 
    mentions = models.ManyToManyField('common.Customer',related_name='mentions')

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

customer = Customer.objects.get(user=request.user)
posts = Post.objects.filter(mentions__in=customer).order_by('-created_at')

Это близко к тому, чего я пытаюсь достичь?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Боюсь, что это абсолютно не так.

customer = Customer.objects.get(user=request.user)
posts = Post.objects.filter(mentions__in=customer).order_by('-created_at')

Сбой при mentions__in = customer, потому что __in поиск ожидает итерацию (которой является один клиентнет).

Помимо этого, этот запрос даст вам все сообщения, в которых упоминается customer, что также может быть достигнуто двумя более простыми способами:

posts = Post.objects.filter(mentions=customer).order_by('-created_at')

posts = customer.mentions.order_by('-created_at') # using the 'related_name' from the customer's side

Выхочу получить всех пользователей, которые упомянуты в посте.Но какой пост?Вы забыли упомянуть об этом в своем вопросе.Вы дали нам только текущего пользователя (request.user), который может иметь несколько сообщений.
Я собираюсь угадать и показать, как вы могли бы привлечь всех других пользователей, упомянутых в сообщениях, сделанных текущим пользователем.
Комучтобы прояснить ситуацию с related_name этого отношения, я изменю его на related_name = 'mentionend'.

posts = Post.objects.filter(mentions=customer) # all posts of the current user

# all other users mentioned in those posts
users = Customer.objects.exclude(user=customer).filter(mentionend__in=posts) # using 'related_name'
# or
users = posts.mentions.exclude(user=customer) 
0 голосов
/ 31 мая 2018

Я видел это в документации многих ко многим, и это работало:

posts = Post.objects.filter(mentions__pk=customer.id)
0 голосов
/ 31 мая 2018

Попробуйте эту строку

users = User.objects.filter(mentions__isnull=False)
...