मैं django-rest-framework का उपयोग करता हूं और मैं एक कथन बनाते समय "भूमिका" और "फ़ंक्शन" फ़ील्ड वैकल्पिक होना चाहता हूं।
कृपया मुझे बताएं कि मैं यह कैसे कर सकता हूं?
मैंने कुछ तरकीबें आजमाईं, उदाहरण:
मैंने कोशिश की:
function = FunctionsCreateSerializer(write_only=True, allow_null=True)
तथा
class Meta:
...
optional_fields = [...]
लेकिन मुझे मिल गया
"function": [
"This field is required."
]
जब मैं कोशिश करता हूं:
function = FunctionsCreateSerializer(write_only=True, required=False)
मुझे समझ आ गया:
/api/उपयोगकर्ता/'फ़ंक्शन'' पर KeyError
मैं वास्तव में समझ नहीं पा रहा हूं कि मैं अपने धारावाहिकों को कैसे बदल सकता हूं
models.py
class Operator(models.Model):
...
role = models.ForeignKey("OperatorRole", related_name="operator", on_delete=models.CASCADE, null=True, blank=True)
class OperatorRole(models.Model):
function = models.ManyToManyField("FunctionRole", null=True)
role = models.TextField(
max_length=2,
choices=Role.choices,
default=Role.THERMIST
)
class FunctionRole(models.Model):
function = models.TextField(
max_length=4,
choices=Function.choices,
default=Function.TPST,
blank=True,
null=True,
)
serizlizers.py
class UserSerializer(serializers.ModelSerializer):
...
role = RoleSerializer()
function = FunctionsCreateSerializer(write_only=True)
class Meta:
model = models.Operator
fields = ["id", "username", "password", "email", "is_active", "fio", "position", "phone", "role", "function",
"created", "updated"]
class FunctionsSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
return instance.function
class Meta:
model = models.FunctionRole
fields = ("function",)
class FunctionsCreateSerializer(serializers.ModelSerializer):
function = serializers.MultipleChoiceField(choices=models.Function)
class Meta:
model = models.FunctionRole
fields = ("function",)
validators = []
class RoleSerializer(serializers.ModelSerializer):
functions = FunctionsSerializer(many=True, read_only=True, source='function', required=False)
class Meta:
model = models.OperatorRole
fields = ("role", "functions",)
views.py
class UserList(generics.ListCreateAPIView):
queryset = models.Operator.objects.all()
serializer_class = serializers.UserSerializer
permission_classes = ADMIN_PERMISSIONS
filter_backends = DEFAULT_FILTERS
filter_class = UserFilter
search_fields = ["user__username", "user__email", "fio", "position",
"phone", "role__role", "role__function__function"]
def create(self, request, *args, **kwargs):
serializer = serializers.UserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
1 उत्तर
समस्या यह है कि : आप UserSerializer
का उपयोग UserList
दृश्य में कर रहे हैं। लेकिन उस धारावाहिक में, आपके पास यह पंक्ति है: function = FunctionsCreateSerializer(write_only=True)
। जैसा कि आप अनुमान लगाते हैं, यह डिफ़ॉल्ट रूप से आवश्यक है। यदि आप function
फ़ील्ड को वैकल्पिक बनाना चाहते हैं, तो :
function = FunctionsCreateSerializer(write_only=True, required=False)
लाइन
function = FunctionsCreateSerializer(write_only=True)
कोUserSerializer
से हटा दें औरfunction
को Meta फ़ील्ड से भी हटा दें।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।