簡體   English   中英

使用帶有 Django 的 ModelSerializer 驗證選擇字段

[英]Validating a choice field with ModelSerializer with Django

我有一個 model BaseUser ,它繼承自AbstractUser並有兩個附加字段:complex_list 和 active_complex。 complex_list 是一個 ManyToManyField,通過一個登記表連接到BaseComplex model。

我希望 active_complex 的默認值為 null 可以在 model 啟動時處理。 我還需要用戶能夠僅從 complex_list 中的值中選擇 active_complex。 為此,我嘗試使用定制的 ModelSerializer:

from rest_framework import serializers
from .models import BaseUser



class ActiveComplexSerializer(serializers.ModelSerializer):
    this_user = serializers.SerializerMethodField('get_this_user')

    choice =[]
    qs = BaseUser.objects.get(username = this_user)
    for cmplx in qs.complex_list:
        choice.append((cmplx.id, cmplx.name))

    active_complex = serializers.ChoiceField(choices = choice)


    class Meta:
        model = BaseUser
        fields = ('active_complex')

    def get_this_user(self, request):

        return request.user

我知道我做錯了什么,因為我得到一個查詢未找到錯誤。 如果您能糾正這一點或提出更好的方法來實現相同的目標,我將不勝感激。

當前代碼的問題是當你打電話時

qs = BaseUser.objects.get(username = this_user)

this_user未綁定到任何特定值。 此代碼僅在 Class 首次初始化時運行一次,而不是在 class 的每個新實例上運行。

相反,您希望在初始化序列化程序 class 時獲取用戶,然后填充選項。

這是一個粗略的更改,我沒有對此進行測試,但它或多或少應該可以工作。

class ActiveComplexSerializer(serializers.ModelSerializer):
    this_user = serializers.SerializerMethodField('get_this_user')
    active_complex = serializers.ChoiceField(choices=[])

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        choice =[]
        qs = BaseUser.objects.get(username = self.fields['this_user'])
        for cmplx in qs.complex_list:
            choice.append((cmplx.id, cmplx.name))
        self.fields['active_complex'].choices = choice

    class Meta:
        model = BaseUser
        fields = ('active_complex')

    def get_this_user(self, request):
        return request.user

另請注意,從https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#django.contrib.auth.get_user_model查看get_user_model() - 最好使用 ZC1C425268E68385D1AB5074C17A94F14 而不是 direclty導入用戶 model。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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