मैं 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)
0
Slad 4 नवम्बर 2021, 18:37

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि : आप UserSerializer का उपयोग UserList दृश्य में कर रहे हैं। लेकिन उस धारावाहिक में, आपके पास यह पंक्ति है: function = FunctionsCreateSerializer(write_only=True)। जैसा कि आप अनुमान लगाते हैं, यह डिफ़ॉल्ट रूप से आवश्यक है। यदि आप function फ़ील्ड को वैकल्पिक बनाना चाहते हैं, तो :

  1. function = FunctionsCreateSerializer(write_only=True, required=False)

  2. लाइन function = FunctionsCreateSerializer(write_only=True) को UserSerializer से हटा दें और function को Meta फ़ील्ड से भी हटा दें।

0
Rvector 4 नवम्बर 2021, 19:24
1) यदि मैं आवश्यक = गलत सेट करता हूं, तो मुझे /api/user/'function'' पर KeyError मिला है 2) यदि मैं लाइन को हटाता हूं, तो मैं ऑपरेटर बनाते समय फ़ंक्शन नहीं जोड़ सकता (मुझे इस फ़ील्ड को वैकल्पिक की आवश्यकता है)
 – 
Slad
5 नवम्बर 2021, 09:00
मैंने इस समस्या को हल किया! धन्यवाद! जब मैं आवश्यक = गलत सेट करता हूं, तो मेरी विधि "बनाएं" ने मान्य डेटा से पॉप "फ़ंक्शन" की कोशिश की, वास्तव में मुझे महत्वपूर्ण त्रुटि मिली :)
 – 
Slad
5 नवम्बर 2021, 09:45