Как связать модель и представление стороннего производителя с собственной моделью в Django
Я успешно внедрил django-contrib-comments в свой проект и начал настраивать его шаг за шагом, чтобы сделать его на 100% подходящим для моего проекта. Теперь у меня возникла следующая проблема, которую я не могу решить:
У меня есть модель Poller
, которая предлагает два возможных голоса для любого пользователя, хранящегося в модели Vote
. Теперь, если пользователь комментирует опросник, я хотел бы вернуть его индивидуальный голос для этого конкретного опросника в отрисованный комментарий в шаблоне.
Поскольку я ни в коем случае не хочу трогать архитектуру 3-й части, я бы предпочел получить требуемый queryset в своем представлении.
Модель комментариев пакета django-contrib-comments
class CommentAbstractModel(BaseCommentAbstractModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
[..]
Мои модели Poller, Vote и Account/User
class Poller(models.Model):
poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
[..]
class Vote(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
created_on = models.DateTimeField(auto_now_add=True)
poller_choice_one_vote = models.BooleanField(default=False)
poller_choice_two_vote = models.BooleanField(default=False)
[..]
class Account(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
[..]
Короче говоря, как я могу получить доступ к модели Vote для каждого пользователя, опубликовавшего комментарий, чтобы определить, какой голос он выбрал? Может быть, путем подклассификации CommentAbstractModel
и добавления внешнего ключа к модели Vote
?
@require_GET
def single_poller(request, poller_id):
"""
renders a specific poller with prepopulated meta according to previous
user interaction, e.g. votes and likes
"""
# Retrieve the item via get
poller = Poller.objects.get(poller_id=poller_id)
[..] # how to go on here?
Вы можете определить GenericRelation
на модели Poller
, чтобы получить все комментарии к определенному опросу. С помощью этого мы можем получить доступ к пользователям и фильтровать голоса на основе этого:
from django.contrib.contenttypes.fields import GenericRelation
class Poller(models.Model):
...
comments = GenericRelation(MyCommentModel) # Change MyCommentModel to the comment model you used
poller = Poller.objects.get(poller_id=poller_id)
votes = Vote.objects.filter(
poller=poller,
user__in=poller.comments.all().values('user')
)