Как связать модель и представление стороннего производителя с собственной моделью в 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')
)
Вернуться на верх