Django сравнивает два набора запросов и создает список на основе этих значений с добавлением дополнительных данных для каждого элемента - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть модель 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)

В представлениях я сначала получаю все пользовательские профили, а затем текущих пользователей. Друзья, как это:

  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" также находится в наборе "current_user_friends", и объединить эту информацию, если это возможно, в один отдельный список или словарь или Queryset, который я могу использовать в шаблон.

Я бы хотел пройтись по циклу и создать новое поле или значение с именем «isFriend» с «True» или «False». Я бы хотел сделать тяжелую работу в представлениях.

Я пытался передать два набора запросов в контекст шаблона с именами «profile» и «user_friends», что-то вроде следующего, что, вероятно, является глупым способом сделать это (в любом случае у него есть некоторые проблемы на стороне «else») :

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

Любая помощь будет принята с благодарностью. У меня возникают проблемы с визуализацией того, как наилучшим образом использовать отношения между этими моделями для выполнения минимальных запросов к базе данных и получения нужного мне результата.

Приветствие Marco

...