मैं अपना "पता" एपीआई डिफ़ॉल्ट मान (खाली स्ट्रिंग "") वापस करने की कोशिश कर रहा हूं, लेकिन जब मैं धारावाहिक क्षेत्र में डिफ़ॉल्ट = "" का उपयोग करता हूं तो यह इसके बजाय शून्य हो जाता है। यह मेरा मुख्य धारावाहिक है (LocationSerializer)


class LocationSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(read_only=True)
    business_id = serializers.PKRelatedField(Business.any.all(), "business")
    city_id = serializers.UUIDField(required=True)
    name = serializers.CharField(max_length=48, required=True)
    tax_number = serializers.CharField(max_length=48)
    phone = serializers.PhoneNumberField()
    address = serializers.CharField()
    address_details = AddressEmbeddedSerializer(default="", source="addresses")
    footer = serializers.CharField()
    is_active = serializers.BooleanField(required=True)
    has_kds = serializers.BooleanField(read_only=True)
    position = serializers.PointField()
    image = serializers.ImageField()
    # profile = LocationProfileSerializer()
    permissions = PermissionSerializer(many=True, read_only=True)
    payment_methods = PaymentMethodEmbeddedSerializer(many=True, read_only=True)

    class Meta:
        model = Location
        fields = (
            "id", "business_id", "city_id", "name", "tax_number", "phone", "address", "address_details", "footer",
            "is_active", "has_kds", "position", "image", "permissions", "payment_methods"
        )

और यह मेरा नेस्टेड धारावाहिक है (AddressEmbeddedSerializer)



class AddressEmbeddedSerializer(serializers.ModelSerializer):
    city = serializers.CharField(default="")
    area = serializers.CharField(default="")
    block = serializers.CharField(default="")
    avenue = serializers.CharField(default="")
    long = serializers.CharField(default="")
    lat = serializers.CharField(default="")

    class Meta:
        model = LocationAddress
        fields = (
            "city", "area", "block", "avenue", "long", "lat"
        )

मैं जिस मूल्य की उम्मीद कर रहा हूं वह है:

"address_details": {
            "city": "",
            "area": "",
            "block": "",
            "avenue": "",
            "long": "",
            "lat": ""
        }

इसके बजाय मुझे जो मिल रहा है वह है:

"address_details": null

कृपया ध्यान दें कि सभी CRUD संचालन काम कर रहे हैं, यह केवल एक डिफ़ॉल्ट मान समस्या है

0
Laith Barghothi 7 पद 2020, 23:13

2 जवाब

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

"address_details": null का कारण यह है कि वर्तमान ऑब्जेक्ट का मॉडल ऑब्जेक्ट पर कोई संबंधित addresses नहीं है, इसलिए नेस्टेड सीरिएलाइज़र का उपयोग नहीं किया जाएगा और इसलिए आपका वांछित JSON आउटपुट उत्पन्न नहीं होगा।

साथ ही, default का उपयोग तब किया जाता है जब POST अनुरोध के साथ फ़ील्ड के लिए कोई मान प्रदान नहीं किया जाता है GET

मेरा सुझाव है कि आप address_details को null होने पर संभाल लें, लेकिन अगर आपको वास्तव में ऐसा करने की ज़रूरत है तो आप to_representation() या to_internal_value() पर कुछ कर सकते हैं, यह उत्तर देखें: https://stackoverflow.com/a/38606711/4984493

साथ ही, आप SerializerMethodField का इस्तेमाल कर सकते हैं, इसलिए obj.addresses के मान के आधार पर यदि यह null था या नहीं, तो आप वांछित JSON आउटपुट वापस नहीं कर सकते।

0
Mahmoud Adel 8 पद 2020, 01:48
धन्यवाद! क्या मैं पूछ सकता हूं, "हैंडल address_details से आपका क्या मतलब है जब यह शून्य है?
 – 
Laith Barghothi
8 पद 2020, 12:03
जैसे जब address_details शून्य हो तो आप खाली स्ट्रिंग के साथ डिफ़ॉल्ट मान लौटाते हैं
 – 
Mahmoud Adel
8 पद 2020, 14:16

आपको many=True< देना होगा /strong> नेस्टेड रिश्तों में झंडा

class LocationSerializer(serializers.ModelSerializer):
    ...
    address = serializers.CharField()
    address_details = AddressEmbeddedSerializer(source="addresses", many=True, read_only=True)
    ...
-1
minglyu 7 पद 2020, 23:52
यह प्रश्न से बिल्कुल भी संबंधित नहीं है
 – 
Mahmoud Adel
8 पद 2020, 01:30