Django比较两个查询集并根据这些值创建一个列表,并为每个项添加额外的数据

时间:2018-04-30 12:14:25

标签: django django-models query-optimization django-queryset

我有一个UserProfile模型和一个好友模型。我在模板的页面上显示配置文件列表,我想标记UserProfile是否是当前用户的朋友,因为每个用户都显示。

我希望避免模板上的嵌套循环,我必须将Friend Queryset与UserProfile Queryset进行比较,看看是否有匹配。

我有这样的模型(没有显示其他字段):

class UserProfile(models.Model):

   user = models.OneToOneField(User, on_delete=models.CASCADE)
   friends = models.ManyToManyField("self", through='relationship.Friend', symmetrical= False, related_name= 'friend_to+' )

class Friend(models.Model):

  from_userprofile = models.ForeignKey("profile.UserProfile", 
    related_name='from_profile', on_delete=models.CASCADE)

  to_userprofile = models.ForeignKey("profile.UserProfile", 
    related_name='to_profile', on_delete=models.CASCADE) 

  status = models.IntegerField(choices=RELATIONSHIP_STATUSES)

  date_connected = models.DateTimeField(auto_now=False, 
    auto_now_add=True)

在视图中,我首先获取所有UserProfiles,然后获得当前用户朋友:

  profile_query = UserProfile.objects.all().exclude(Q(user_id=request.user.id)).
  select_related('user')

  current_user_friends = Friend.objects.filter(Q(from_userprofile__user_id=request.user.id)
                                                 & Q(status__exact=1))

现在我想从这里有效地找出" profile_query"中的哪些用户? set也在" current_user_friends"如果可能,将此信息设置并合并到一个单独的列表或字典或我可以在模板中使用的Queryset中。

我想循环并创建一个名为" isFriend"的新字段或值。与#34; True"或"错误"。我显然希望在意见中做繁重的工作。

我试图将两个查询集传递到名为" profiles"的模板上下文中。和" user_friends"像下面这样的东西可能是一种垃圾方式(它还有一些问题,其他的"其他"方面):

          {% for friend in user_friends %}
            {% if friend.to_userprofile.user_id == profile.user_id %}
                <div>FRIEND</div>
                {% else %}
                 <div>NOT FRIEND</div>
            {% endif %}
        {% endfor %}

任何帮助将不胜感激。我无法直观地了解如何最好地使用这些模型之间的关系来进行最小的数据库查询并获得我需要的结果。

干杯 马可

0 个答案:

没有答案