簡體   English   中英

Django REST框架:在序列化器中獲取相關模型的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM