Python Django查询将一个模型作为另一个模型返回
我找不到类似的问题(可能是因为我不知道正确的措辞),但这是我的两难选择。我有两个模型,一个显示另一个的关系 我希望能够比较html模板中的“用户列表”和“朋友列表”,以便确定如果已经存在朋友关系,是否在“可用用户”部分显示用户 但是,“用户列表”对象属于CustomUser模型类型,“好友列表”对象属于好友模型类型。如何返回get_friends()方法的结果,以便将这些朋友从“user_list”查询集中排除,最好是通过pk,这样我就不必担心字符串比较了 谢谢大家! Models.pyPython Django查询将一个模型作为另一个模型返回,python,django,Python,Django,我找不到类似的问题(可能是因为我不知道正确的措辞),但这是我的两难选择。我有两个模型,一个显示另一个的关系 我希望能够比较html模板中的“用户列表”和“朋友列表”,以便确定如果已经存在朋友关系,是否在“可用用户”部分显示用户 但是,“用户列表”对象属于CustomUser模型类型,“好友列表”对象属于好友模型类型。如何返回get_friends()方法的结果,以便将这些朋友从“user_list”查询集中排除,最好是通过pk,这样我就不必担心字符串比较了 谢谢大家! Models.py cla
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)
经理.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 %}
{%extends'base.html%}
{%block content%}
可用用户
{用户列表%中的用户的百分比}
{%如果用户不在好友列表%}
{{user}}
{%endif%}
{%endfor%}
朋友
{朋友列表%中的朋友为%0}
{{朋友}
{%endfor%}
{%endblock内容%}
您只需更改查询即可获得CustomUser
。因此,查询应该类似于CustomeUser.objects.filter(user2\uu user1=self.user)
这将为您提供与self.user
为好友的CustomUser
s。根据您解释关系的方式,您还需要查询CustomUser.objects.filter(user1\uuu user2=self.user)
。这些查询应该取代视图中的get\u friends()
方法中的查询。您是否考虑过在视图中建立可用用户列表并传递它?您在视图中比在模板中有更多的灵活性。感谢您的输入。我确实考虑过这一点,但仍在努力协调Friend.user和CustomUser.user之间的矛盾。在这一点上,我真的很想知道是否有一种优雅的方法可以在模型类之间进行比较或转换;尽管我确信我可以通过对两种模型类型的主ID进行列表比较来拼凑出一个解决方案。