同様の質問を見つけることができませんでしたが(おそらく正しい言い回しがわからないため)、これが私のジレンマです。私には2つのモデルがあり、一方は他方の関係を示しています。
友達関係がすでに存在する場合に「利用可能なユーザー」セクションにユーザーを表示しないかどうかを判断できるように、htmlテンプレートの「user_list」と「friends_list」を比較できるようにしたいと思います。
ただし、「user_list」オブジェクトはCustomUserモデルタイプであり、「friends_list」オブジェクトはFriendモデルタイプです。get_friends()メソッドの結果を返すには、これらの友達を 'user_list'クエリセットから、できればpkで除外して、文字列の比較について心配する必要がないようにするにはどうすればよいですか?
ありがとうございました!
Models.py
class CustomUserModel(AbstractBaseUser, PermissionsMixin):
# Simplified for brevity
username = models.CharFiend(_('username'), unique=True)
class Friend(models.Model):
user1 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete.models.CASCADE, related_name='user1')
user2 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete.models.CASCADE, related_name='user2')
objects = FriendManager()
class Meta:
unique_together = ('user1', 'user2')
def __str__(self):
return str(self.user2)
Managers.py
class FriendManager(models.Manager):
def is_friend(self, user1, user2):
if not user1 or not user2:
return False
return super(FriendManager, self).get_queryset().filter(user1=user1).filter(user2=user2).exists()
def get_friends(self, user):
return super(FriendManager, self).get_queryset().filter(user1=user)
Views.py
class UserList(ListView):
model = get_user_model()
context_object_name = "object_list"
template_name = "users.html"
def dispatch(self, request, *args, **kwargs):
self.user = get_user(request)
return super(UserList, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
return get_user_model().objects.order_by("-date_joined")
def get_friends(self):
if self.user:
return Friend.objects.get_friends(self.user).order_by("user2")
return None
def get(self, request, *args, **kwargs):
return render(request, self.template_name, {
'user_list': self.get_queryset(),
'friends_list': self.get_friends(),
'user': self.user
})
Users.html
{% extends 'base.html' %}
{% block content %}
<h1>Available Users</h1>
{% for user in user_list %}
{% if user not in friends_list %} <!-- This is my pain-point -->
<p>{{ user }}</p>
{% endif %}
{% endfor %}
<h1>Friends</h1>
{% for friend in friends_list %}
<p>{{ friend }}</p>
{% endfor %}
{% endblock content %}
クエリを変更するだけで、を取得できCustomUser
ます。したがって、クエリは次のようにCustomeUser.objects.filter(user2__user1=self.user)
なります。CustomUser
は、と友達であるを提供しself.user
ます。関係をどのように解釈するかに応じて、もクエリする必要がありますCustomUser.objects.filter(user1__user2=self.user)
。これらのクエリはget_friends()
、ビューのメソッドのクエリを置き換える必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加