2013-11-27 61 views
3

我必须通过一个ForeignKey如何在related_name字段上进行查询?

class User(AbstractUser): 
    ... 

class PrivateMessage(models.Model): 
    user_from = models.ForeignKey(
     User, 
     verbose_name=u'From', 
     related_name='sent_messages', 
    ) 
    user_to = models.ForeignKey(
     User, 
     verbose_name=u'To', 
     related_name='received_messages', 
    ) 

连接模式有没有什么办法让所有的地址为特定的用户。例如,如果

u = User.objects.get(id=1) 
messages = PrivateMessage.objects.filter(user_from=u) 
for m in messages: 
    users.add(m.user_to) 

如何获取出现在user_to仅使用Django的ORM方法这些消息的用户列表?

+0

你可以试试'User.objects.filter(received_messages__user_from = U)'? – lalo

回答

1

最后,我最后写三个查询:

users_from = set(PrivateMessage.objects.filter(
     user_to=self.request.user, 
    ).values_list(
     'user_from__pk', 
     flat=True, 
    )) 
    users_to = set(PrivateMessage.objects.filter(
     user_from=self.request.user, 
    ).values_list(
     'user_to__pk', 
     flat=True, 
    )) 
    interlocutors = User.objects.filter(pk__in=users_from.union(users_to)) 
0

我看到这个docs

也许你可以试试:

u = User.objects.get(id=1) 
users = User.objects.filter(received_messages__user_from=u).distinct() 
+0

它给了我一个错误'FieldError:无法解析关键字'received_messages'到字段中.' – vero4ka

+0

你确定你没有使用auth.User在那里的某个地方,这将不会有关系吗? – krs

+0

我使用''AbstractUser'',所以在''ForeightKey''字段中它看起来像''settings.AUTH_USER_MODEL'' – vero4ka

0

我想一个更好的想法是对User模型中定义ManyToManyField

class User(AbstractUser): 
    #... 
    receivers = models.ManyToManyField('self', through='Message', 
             symmetrical=False, related_name="senders") 

class Message(models.Model): 
    user_from = models.ForeignKey(MyUser, related_name='messages_from') 
    user_to = models.ForeignKey(MyUser, related_name='messages_to') 
    message = models.CharField(max_length=100, default="") 
    #... 

然后检索用户在另一端列表,你只需做:

User.objects.get(id=1).receivers.all() # who I sent the message to 
User.objects.get(id=1).senders.all() # who sent me a message 

这种方式你有一个很好的清晰的API。

相关问题