Как отобразить поле внешнего ключа в Django

#django #django-models #django-queryset

Вопрос:

Желаемый результат: Когда я визуализирую опросник и связанные с ним комментарии, я хотел бы также отобразить Vote пользователя, выбранного для опроса, вместе с его комментарием (Примечание: Пользователь может комментировать только в том случае, если он проголосовал за этот опросник).

Примечание: Пользователь может отдать один голос участнику опроса и оставить один комментарий участнику опроса. Он может комментировать только в том случае, если проголосовал заранее.

 # Models

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)
    poller_text = models.CharField(max_length=333)
    poller_choice_one = models.CharField(max_length=20)
    poller_choice_two = models.CharField(max_length=20)


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)

    def __str__(self):
        return f'Vote by {self.user}'


class Comment(models.Model):
    poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='PollerComment')
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    comment = models.TextField(max_length=350)
    flag_count = models.IntegerField(default=0)
    upvote_count = models.IntegerField(default=0)
    downvote_count = models.IntegerField(default=0)
 
 # View

@require_GET
def render_single_poller(request, poller_id):

    # Retrieve comments associated to the Poller
    comments_qs = PollerComment.objects.filter(poller_id=poller_id)

context = {
        'comments_qs': comments_qs,
    }
    return render(request, 'pollboard/single_poller.html', context)
 

Я попытался сделать это с помощью шаблона фильтра, например:

 # pollboard_tags.py

@register.filter(name='get_vote')
def get_voted(self):
    self.vote_made = 'Test'
    print(self.vote.poller_choice_one_vote)
    if self.vote.poller_choice_one_vote:
        self.vote_made = 'One'
    else:
        self.vote_made = 'Two'
    return self.vote_made
 
 # template

<div class="commentors-poller-choice">{{ comment|get_vote }}</div>
 

бросает

Связанный объект не существует по адресу /опросник/68c725eb-277e-4b5b-a61b-b4a02bf5e854/ Опрос не имеет права голоса.

Я боюсь, что я уже все здесь усложняю. Я надеюсь, что для этого есть более простое решение, например, idk, расширяющий набор запросов комментариев необходимой информацией для рендеринга?

Комментарии:

1. Попытайтесь измениться self.vote = 'Two' на self.vote_made = 'Two' . Если self.vote.poller_choice_one_vote возвращает false, self.vote_made будет пусто

2. @BrianD ах, спасибо за подсказку, но она все равно ничего не возвращает.. Однако я визуализирую другие поля в цикле шаблонов, поэтому набор запросов существует

3. Как вы фильтруете с PollerComment помощью ? PollerComment является ли родственное имя, а не модель правильным?

Ответ №1:

Если пользователь может проголосовать за опрашиваемого только один раз, вы можете отфильтровать его с помощью:

 @register.filter(name='get_vote')
def get_voted(self):
    vote = Vote.objects.get(poller=self.poller, user=self.user)
    return 'One' if vote.poller_choice_one_vote else 'Two'
 

Ответ №2:

Попробуй вот это:

 def get_vote(self):
        """
        Get the vote made to the Poller
        of the user who commented
        """
        self.vote_made = ''
        if self.vote.poller_choice_one_vote==True:
            self.vote_made = 'One'
        else:
            self.vote = 'Two'
        return self.vote_made
 

Комментарии:

1. вызывает ошибку: объект «Опрос» не имеет атрибута «голос__опрашиваемый_выбор_один_голос». (также ваше логическое значение в нижнем регистре)

2. попробуй сейчас……..