Лучший способ получения связанного объекта в отношениях "многие ко многим" (Self Refrencing ManyToMany Relationship)?
Я работаю над небольшим приложением, содержащим модели CustomUser и PollQuestion. CustomUser имеет отношение ManyToMany между собой, а CustomUser может иметь несколько PollsQuestion, поэтому между ними существует отношение Foreign Key. Аутентифицированный пользователь может видеть только опросы, созданные пользователями, за которыми он следит, чтобы полностью удовлетворить это требование, я написал следующее представление**:-**. На самом деле это не представление, а метод утилиты, возвращающий опросы в исходное представление.
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
Note:- Вы также можете предложить мне лучшее название для этого поста?
Заранее спасибо, Надеюсь получить от вас ответ в ближайшее время.
Просто
def all_polls_utils(request):
all_polls_by_followed = PollQuestion.objects.filter(
user__in=request.user.get_all_followings()
)
В качестве отступления, вам, вероятно, следует переименовать user
many-to-many в CustomUser
, например, в followed_users
(с соответствующим именем followers
).