2014-11-19 13 views
6

पर आधारित संबंधित फ़ील्ड के साथ मॉडल को कैसे सहेजना है, मैं डीआरएफ के लिए नया हूं। मैं रिकार्ड मॉडल है कि इस तरह दिखता है:डीजेगो रेस्ट फ्रेमवर्क आईडी

class RecordSerializer(serializers.ModelSerializer): 

    now = datetime.today() 
    owner = serializers.Field(source='owner.username') 
    time_start = serializers.DateTimeField(source='now') 

    class Meta: 
     model = Records 
     fields = ("owner", "activity", "time_start") 

और यह दृश्य है:

class Records(models.Model): 
    owner = models.ForeignKey(User, null=True) 
    activity = models.ForeignKey(Activity, null=True) 
    time_start = models.DateTimeField(null=True) 
    time_end = models.DateTimeField(null=True) 

    ... 

RecordSerializer इस एक है

class StartApiView(generics.CreateAPIView): 
    model = Records 
    serializer_class = RecordSerializer 

    def pre_save(self, obj): 
     obj.owner = self.request.user 

पोस्ट अनुरोध बैकबोन से भेजा जाने वाला है इसमें गतिविधि आईडी वाला एक फ़ील्ड शामिल है, उदाहरण के लिए "{गतिविधि: 12}"। अगर मैं रिकॉर्ड को सहेजने के लिए दृश्य चाहता हूं और गतिविधि को 12 की आईडी के साथ गतिविधि में सेट करना चाहता हूं तो मुझे क्या करना चाहिए?

उत्तर

2

Django REST Framework provides a PrimaryKeyRelatedField बिल्कुल इस उपयोग के मामले के लिए।

class RecordSerializer(serializers.ModelSerializer): 
    activity = serializers.PrimaryKeyRelatedField() 
    owner = serializers.CharField(read_only=True, source='owner.username') 
    time_start = serializers.DateTimeField(source='now') 

    class Meta: 
     model = Records 
     fields = ("owner", "activity", "time_start") 

यह आप के लिए क्या देख रहे करने के लिए इसी उत्पादन का उत्पादन होगा, और यह गतिविधि के id स्वीकार करेंगे जब आप इसे अद्यतन करना चाहते।

+1

आपके उत्तर के लिए धन्यवाद, बहुत उपयोगी संदर्भ। जैसे ही मुझे दृश्य काम मिल रहा है, मैं इसे स्वीकार करूंगा। अभी मैं एक और त्रुटि हल करने की कोशिश कर रहा हूं, मैंने इसे इस प्रश्न पर पोस्ट किया है, शायद आप मुझे वहां एक हाथ भी दे सकते हैं: http://stackoverflow.com/questions/27030449/django-rest-framework-modelfield-requires- मॉडल-क्षेत्र-kwarg। – alejoss

17

स्वीकार किए जाते हैं जवाब डीआरएफ v2.x लेकिन is no longer for newer (3.x) versions के लिए सच था, के रूप में यह इस AssertionError उठाएंगे:

AssertionError: Relational field must provide a queryset argument, or set read_only=True .

नए संस्करणों के लिए, बस यह करने के लिए queryset तर्क जोड़ें:

class RecordSerializer(serializers.ModelSerializer): 
    activity = serializers.PrimaryKeyRelatedField(queryset=Activity.objects.all()) 
    // [...] 
संबंधित मुद्दे