首页 > 解决方案 > 在自引用多对多关系中获取相关对象的更好方法?

问题描述

我正在开发一个包含模型 CustomUser 和 PollQuestion 的小型应用程序。CustomUser 在其自身和 CustomUser 之间具有 ManyToMany 关系也可以有多个 PollsQuestion,因此它们之间存在外键关系。经过身份验证的用户只能看到他关注的用户提出的民意调查,为了完全满足这个要求,我编写了以下视图**:-** 实际上这不是视图,这是一种将民意调查返回到原始视图的实用方法。

def all_polls_utils(request):
    following = request.user.get_all_followings().values_list("id")
    user_id = [id[0] for id in following]
    all_polls = PollQuestion.objects.none()
    for u_id in user_id:
        user = CustomUser.objects.get(id=u_id)
        polls = user.poll_questions.all()
        all_polls = all_polls | polls
    return all_polls

主要问题:- 有没有更好的方法来做同样的事情? 任何建议都将受到高度赞赏

我在下面发布模型:-

from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.
class CustomUser(AbstractUser):
    email = models.EmailField(max_length=250, null=False)
    name = models.CharField(max_length=50, null=False)
    username = models.CharField(max_length=50, null=False, unique=True)
    password = models.CharField(max_length=15, null=False)
    user = models.ManyToManyField('self', through='Relationship', symmetrical=False, related_name='related_to')

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['name', 'email']

    def get_all_polls(self):
        pass

    def create_relationship(self, person):
        status, obj = Relationship.objects.get_or_create(
            to_person=person,
            from_person=self,
        )
        return status

    def remove_relationship(self, person):
        Relationship.objects.filter(
            from_person=self,
            to_person=person
        ).delete()
        return 'dummy_value'

    def get_all_followings(self):
        return self.user.all()


class Relationship(models.Model):
    from_person = models.ForeignKey(CustomUser, related_name='from_people', on_delete=models.CASCADE)
    to_person = models.ForeignKey(CustomUser, related_name='to_person', on_delete=models.CASCADE)

和投票问题:-

class PollQuestion(models.Model):
    user = models.ForeignKey(CustomUser, null=True, on_delete=models.CASCADE, related_name="poll_questions")
   # Other fields

注意:- 你也可以为这篇文章建议一个更好的标题吗?

在此先感谢您,希望您能尽快来这里。

标签: pythondjangodjango-models

解决方案


简单地

def all_polls_utils(request):
    all_polls_by_followed = PollQuestion.objects.filter(
        user__in=request.user.get_all_followings()
    )

顺便说一句,您可能应该将user多对多重命名CustomUser为 eg followed_users(使用相关名称followers)。


推荐阅读