2009-04-16 3 views
1

поэтому у меня есть эта модель:фильтр для многих многих областях

class Message(models.Model): 
    creator = models.ForeignKey(User, unique=True) 
    note = models.CharField(max_length=200, blank=True) 
    recipients = models.ManyToManyField(User, related_name="shared_to") 
    read = models.ManyToManyField(User, related_name="read", blank=True) 

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

messages = user.shared_to.all() 

for message in messages: 
    if user not in message.read: 
     do something 

Я уверен, что есть способ отфильтровать это, но я не могу понять, как это сделать.

ответ

0

Я думаю, что я изначально неправильно понял ваш вопрос. Попробуйте выполнить следующий запрос.

for message in user.shared_to.exclude(read__id__in=[user.id]): 
    do_something() 
1

Если вы используете версию разработки Django, или подождать, пока версия 1.1 не будет отпущена, то ваши фильтры могут reference other fields in the model. Таким образом, ваш запрос будет выглядеть следующим образом:

>>> Message.objects.filter(recipients=F('read')) 

(Примечание: Я прописана reciepients такой же, как у вас в вашей модели, хотя правильное написание было бы «получатели»)

Редактировать:

Хорошо, ваш вопрос смущает. Когда я дал вышеприведенный ответ, я читал ваше заявление о том, что вы хотели, чтобы все пользователи, которые находились в «получателях» и «читали»). Но затем, прочитав фрагмент кода, похоже, что вам нужен список пользователей, которые являются получателями, но еще не вошли в список «читать».

Это вероятно то, что вы хотите, но я не совсем уверен, что из-за расплывчатых требований, и я не могу быстро проверить:

# Get list of recipients 
shared_to = Message.shared_to.all().values('id') 

# Now list of recipients who are not in the read field 
unread = Message.objects.exclude(recipients__in=shared_to) 

Это сделает один запрос, но если вы используете MySQL, он все равно может быть more efficient to do two queries (см. предупреждение о соображениях производительности).

Смежные вопросы