![](/img/trans.png)
[英]Django Rest Framework - Get related model field in serializer
[英]Django REST framework: get field of related model in serializer
我是 Django Rest Framework 的新手。 我試圖讓我的ListAPI
顯示我的Quiz
(和相關)模型的各個領域。 它工作正常,除了我的attempt_number
字段。 我得到了正確的查詢集,但我不確定如何只獲取每個查詢的相關值。 用戶可以根據需要多次參加每個測驗,我想顯示每次嘗試的查詢集,因為分數等會有所不同。
我的模型設置如下:
class Quiz(models.Model):
title = models.CharField(max_length=15)
slug = models.SlugField(blank=True)
questions_count = models.IntegerField(default=0)
class Question(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
label = models.CharField(max_length=1000)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.CharField(max_length=100)
is_correct = models.BooleanField('Correct answer', default=False)
class QuizTaker(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
correct_answers = models.IntegerField(default=0)
completed = models.BooleanField(default=False)
attempt_number = models.PositiveIntegerField(default=0)
我的ListAPI
序列化程序如下所示:
class MyQuizListSerializer(serializers.ModelSerializer):
attempt = serializers.SerializerMethodField()
# etc..
class Meta:
model = Quiz
fields = "__all__"
def get_attempt(self, obj):
try:
quiztaker = QuizTaker.objects.filter(user=self.context['request'].user,
quiz=obj)
for attempt in quiztaker:
attempt_number = attempt.attempt_number
return attempt_number
如果我這樣做,我總是得到attempt_number
的最后一個值(因為循環覆蓋了該值)。 然后我嘗試將其附加到列表中,如下所示:
a = []
for attempt in quiztaker:
attempt_number = attempt.attempt_number
a.append(attempt_number)
return a
但是后來我得到了每個查詢的嘗試列表,而不是每個查詢的嘗試次數。 即我得到以下三次(因為在這種情況下有三次嘗試):
{
"id": 4,
"attempt": [
1,
2,
3
]
},
但相反,我想要的是(對於嘗試 2 和 3 等也是如此):
{
"id": 4,
"attempt": 1
},
所以我嘗試這樣做:
return a[attempt_number-1]
希望它會給我第 1 次嘗試的索引零,第 1 次的 2 等索引。但是我仍然只得到最后一次嘗試的次數(在這種情況下為 3)。 我該如何解決這個問題?
我還嘗試使用IntegerField
而不是SerializerMethodField
,如下所示:
attempt = serializers.IntegerField(read_only=True, source='quiztaker.attempt_number')
但它什么也沒返回。
如果我正確理解您,您希望將嘗試列表添加到每個測驗對象。
{
"id": 4,
"attempts": [{
"id": 1,
"attempt_number": 1,
},
{
"id": 2,
"attempt_number": 2,
}...]
}
在這種情況下,您應該為QuizTaker
模型使用單獨的序列化程序,並序列SerializerMethodField
的對象。
class QuizTakerSerializer(serializers.ModelSerializer):
class Meta:
model = QuizTaker
fields = ('id', 'attempt_number')
class MyQuizListSerializer(serializers.ModelSerializer):
attempts = serializers.SerializerMethodField()
# etc..
class Meta:
model = Quiz
fields = "__all__"
def get_attempts(self, obj):
quiztakers = QuizTaker.objects.filter(user=self.context['request'].user,quiz=obj)
return QuizTakerSerializer(quiztakers, many=True).data
老實說,您的問題不是很清楚,這將有助於對其進行編輯並使其更清晰,從而提供您想要實現的 JSON 結構。 我還懷疑您對queryset
的預期用途並不是 ORM 對象容器的實際 Django 含義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.