如何从Django的ForeignKey模型中仅获取一项?

时间:2018-07-02 16:08:38

标签: python django django-models django-views

我的应用程序中有以下两种型号,

class Question(models.Model):
   question_text = models.CharField(max_length=200)
   question_author = models.ForeignKey(User, on_delete=models.CASCADE)
   q_pub_date = models.DateTimeField('Date Question Published')

   def __str__(self):
      return self.question_text


class Answer(models.Model):
   answer_text = models.CharField(max_length=5000)
   answer_author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='ans_auth')
   question = models.ForeignKey(Question, on_delete=models.CASCADE)
   a_pub_date = models.DateTimeField('Date Answer Published')

   def __str__(self):
      return self.answer_text

我想在首页上显示最新问题。列表中的每个项目都会显示问题文本和针对该特定问题发布的众多问题中的一个答案。我能够显示问题文本,但无法在下面的视图中找到获取每个问题项目答案的方法,

def home(request):
   latest_question = Question.objects.order_by('-q_pub_date')[:15]

2 个答案:

答案 0 :(得分:1)

您可以使用related_name访问所有答案:

>>> question = Question.objects.get(question_text='random question')
>>> print(question.answer_set.all())

您可以在https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.related_name

上了解更多有关此内容的信息。

答案 1 :(得分:0)

您可以针对特定的问题获得 answer ,在视图中具有question_instance.answer_set.all()的反向关系,在模板中具有{{ question_instance.answer_set.all }}的反向关系。

要选择一个答案,可以使用slicefirst()

{{question_instance.answer_set.all.0 }} # templates

question_instance.answer_set.first() # views
  

如果您想向问题添加新字段votes,并且希望获得投票数最高的 answer

问题模型中的属性方法将执行以下操作:

@property
def higher_answer(self):
    return self.answer_set.all().order_by('vote').last()