Django查询返回一个模型作为另一个模型

2024-04-19 06:40:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我找不到一个类似的问题(也许是因为我不知道正确的措辞),但这是我的困境。我有两个模型,一个显示另一个的关系。你知道吗

我希望能够比较html模板中的“用户列表”和“朋友列表”,以便确定如果已经存在朋友关系,是否不在“可用用户”部分显示用户。你知道吗

但是,“user\u list”对象是CustomUser模型类型,“friends\u list”对象是friends模型类型。如何返回get\u friends()方法的结果,以便将这些朋友从“user\u list”查询集中排除,最好通过pk排除,这样就不必担心字符串比较了?你知道吗

谢谢你!你知道吗

你知道吗型号.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)

你知道吗经理.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)

你知道吗视图.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
        })

你知道吗用户.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 %}

Tags: 用户nameselfgetreturnmodelsrequestdef
1条回答
网友
1楼 · 发布于 2024-04-19 06:40:20

您只需更改查询即可获得CustomUser。所以查询应该类似于CustomeUser.objects.filter(user2__user1=self.user),这将为您提供与self.user是朋友的CustomUser。根据您如何解释关系,您还需要查询CustomUser.objects.filter(user1__user2=self.user)。这些查询应该替换视图的get_friends()方法中的查询。你知道吗

相关问题 更多 >