10

में Nullable ForeignKey क्षेत्रों Django बाकी फ्रेमवर्क (2.1.16) में मैं व्यर्थ FK क्षेत्र type के साथ एक मॉडल है, लेकिन पोस्ट निर्माण अनुरोध 400 bad request जो कहता है कि फ़ील्ड की आवश्यकता है देता है।Django बाकी ढांचे

मेरे मॉडल

class Product(Model): 
    barcode = models.CharField(max_length=13) 
    type = models.ForeignKey(ProdType, null=True, blank=True) 

है और serializer है:

class ProductSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     exclude = ('id') 

मैं की तरह

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type') 
    class Meta: 
     model = Product 
     exclude = ('id') 

serializer के लिए स्पष्ट रूप से type जोड़ने की कोशिश की है और यह कोई प्रभाव नहीं है।

http://django-rest-framework.org/topics/release-notes.html#21x-series मुझे लगता है कि वहाँ एक बग था, लेकिन यह 2.1.7 में तय किया गया था से।

मुझे अपने एफके फ़ील्ड को सही तरीके से संभालने के लिए सीरियलाइज़र को कैसे बदलना चाहिए?

धन्यवाद!


अद्यतन: खोल से यह देता है

>>> serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
>>> print serializer.is_valid() 
True 
>>> 
>>> print serializer.errors 
{} 

लेकिन प्रकार के बिना = कोई नहीं:

>>> serializer = ProductSerializer(data={'barcode': 'foo'}) 
>>> print serializer.is_valid() 
False 
>>> print serializer.errors 
{'type': [u'This field is required.']} 
>>> serializer.fields['type'] 
<rest_framework.relations.PrimaryKeyRelatedField object at 0x22a6cd0> 
>>> print serializer.errors 
{'type': [u'This field is required.']} 

दोनों ही मामलों में यह देता है

>>> serializer.fields['type'].null 
True 
>>> serializer.fields['type'].__dict__ 
{'read_only': False, ..., 'parent': <prodcomp.serializers.ProductSerializer object at 0x22a68d0>, ...'_queryset': <mptt.managers.TreeManager object at 0x21bd1d0>, 'required': True, 
+0

मत सोचो इससे आपकी समस्या से संबंधित है, लेकिन उन 'exclude' विकल्प की तरह दिखता है एक याद कर रहे हैं अल्पविराम, जो उन्हें ट्यूपल्स के रूप में माना जाएगा। 'बहिष्कृत करें ('आईडी',)' –

+0

यह भी ध्यान दें कि आपको 'स्रोत =' प्रकार 'की आवश्यकता नहीं है, क्योंकि इस मामले में फ़ील्ड नाम पहले से ही उस स्रोत से मेल खाता है जिसका आप उपयोग करना चाहते हैं। –

+0

@TomChristie हां, मैंने पहले 'स्रोत =' प्रकार ' –

उत्तर

5

मैं सुनिश्चित नहीं है कि क्या हो रहा है वहां, हमें उस मामले के लिए कवरेज मिला है और इसी तरह के मामले मेरे लिए ठीक काम करते हैं।

शायद खोल में छोड़ने और सीधे serializer निरीक्षण प्रयास करें।

उदाहरण के लिए यदि आप serializer का दृष्टांत, क्या serializer.fields वापसी करता है? serializer.field['type'].null के बारे में कैसे? यदि आप सीरियलइज़र को सीधे शेल में डेटा पास करते हैं तो आपको क्या परिणाम मिलते हैं?

उदाहरण के लिए:

serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
print serializer.is_valid() 
print serializer.errors 

आप उन लोगों के लिए कुछ जवाब मिलता है, सवाल का अद्यतन करें और अगर हम इसे हल कर प्राप्त कर सकते हैं हम देखेंगे।

संपादित

ठीक है, कि चीजें बेहतर बताते हैं। 'प्रकार' फ़ील्ड शून्य है, इसलिए यह None हो सकता है, लेकिन यह अभी भी एक आवश्यक फ़ील्ड है। यदि आप इसे शून्य करना चाहते हैं तो आपको इसे स्पष्ट रूप से None पर सेट करना होगा।

यदि आप वास्तव में डेटा पोस्ट करते समय फ़ील्ड को बाहर करने में सक्षम होना चाहते हैं, तो आप serializer फ़ील्ड पर required=False ध्वज शामिल कर सकते हैं।

+1

धन्यवाद के बिना कोशिश की है, मैंने खोल से आउटपुट के साथ प्रश्न अपडेट किया है। –

+1

धन्यवाद, 'टाइप = serializers.PrimaryKeyRelatedField (आवश्यक = गलत) 'serializer मदद करता है। (थॉट 'नल = ट्रू' का मतलब वही है) –

+4

बस अगर कोई फ़ील्ड को शून्य करने के लिए खोज कर रहा है और इस धागे पर भी ठोकर खा रहा है: यदि आप प्राथमिक क्षेत्र को प्राथमिक प्राथमिकता के लिए स्पष्ट रूप से सक्षम करना चाहते हैं, तो आपको यह जोड़ना चाहिए: allow_null = सच :) – gabn88

6

जब serializer आरंभ kwarg allow_null जोड़ें:

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type', allow_null=True) 

जैसा कि पहले ही @ gabn88 की टिप्पणी में उल्लेख किया है, लेकिन मैं यह अपने आप ही जवाब समर्थन करती है। (मुझे कुछ समय लागत, क्योंकि मैं केवल अपने आप से यह जानने के बाद कि टिप्पणी पढ़ें।)

देखें http://www.django-rest-framework.org/api-guide/relations/

संबंधित मुद्दे