python - 在自引用多对多关系中获取相关对象的更好方法?
问题描述
我正在开发一个包含模型 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
注意:- 你也可以为这篇文章建议一个更好的标题吗?
在此先感谢您,希望您能尽快来这里。
解决方案
简单地
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
)。
推荐阅读
- r - 如何保存高度很长的图片
- python - 带有 API 调用的 Django LRU_Cache
- lisp - 在 lisp 中查找最大值
- ios - HKAnchoredObejctQuery 不返回新结果+不一致
- firebase - Firebase 身份验证:PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
- javascript - 映射数组时出现问题 - React with Redux Toolkit
- java - 我可以在另一个方法的参数列表中调用另一个方法吗?
- python - Python将bs4.element.Tag(html表)转换为pandas数据框
- qualtrics - 如何在 Qualtrics 中将响应索引通过文本管道传输到单个多项选择问题中?
- python - VS 代码看不到解释器