2016-02-17 6 views
5

मैं एक लिखने योग्य नेस्टेड धारावाहिक बनाने की कोशिश कर रहा हूं। मेरा मूल मॉडल गेम है और नेस्टेड मॉडल मापन हैं। मैं इस डेटा को AJAX का उपयोग करके अपने डीआरएफ एप्लिकेशन में पोस्ट करने की कोशिश कर रहा हूं। हालांकि, डेटा पोस्ट करने का प्रयास करते समय, नेस्टेड मापन खाली ऑर्डर्ड डिक्ट() हैं।कई घोंसला वाली वस्तुओं के साथ Django Rest Framework लिखने योग्य नेस्टेड धारावाहिक

class Game(models.Model): 
    start_timestamp = models.DateTimeField(auto_now_add=False) 
    end_timestamp = models.DateTimeField(auto_now_add=False) 
    date_added = models.DateTimeField(auto_now_add=True) 


class Measurement(models.Model): 
    game = models.ForeignKey(Game, on_delete=models.PROTECT, related_name='measurements') 
    measurement_type = models.CharField(max_length=56) 
    measurement = models.CharField(max_length=56) 
    timestamp = models.DateTimeField(auto_now_add=False) 
    date_added = models.DateTimeField(auto_now_add=True) 

यहाँ मेरी serializers हैं::

class MeasurementSerializer(serializers.ModelSerializer): 
     timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601']), required=False) 

     class Meta: 
      model = Measurement 
      fields = ('measurement_type', 'measurement', 'timestamp') 


class GameSerializer(serializers.ModelSerializer): 
    start_timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601'])) 
    end_timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601'])) 
    measurements = MeasurementSerializer(many=True) 

    class Meta: 
     model = Game 
     fields = ('id', 'start_timestamp', 'end_timestamp', 'measurements') 

    def create(self, validated_data): 
     measurements = validated_data.pop('measurements') 
     game = Game.objects.create(**validated_data) 
     for measurement in measurements: 
      Measurement.objects.create(game=game, **measurement) 
     return game 

खेल के लिए मेरा विचार निम्नलिखित है:

class GameList(generics.ListCreateAPIView): 
    queryset = Game.objects.all() 
    serializer_class = GameSerializer 

मैं संरचना के लिए this tutorial पीछा

यहाँ मेरी मॉडल हैं।

मैं AJAX के माध्यम से इस एपीआई को पोस्ट करने के लिए कोशिश कर रहा हूँ, नीचे दिए गए कोड:

$.ajax({ 
     url: base_url + '/games/', 
     dataType: "json", 
     data: { 
       "start_timestamp": "2016-02-16 14:51:43.000000", 
       "end_timestamp": "2016-02-16 14:53:43.000000", 
       "measurements":[ 
        {'measurement_type':'type1', 'measurement':'71', 'timestamp':'2016-02-16 14:53:43.000000'}, 
        {'measurement_type':'type1', 'measurement':'72', 'timestamp':'2016-02-16 14:54:43.000000'}, 
        {'measurement_type':'type1', 'measurement':'73', 'timestamp':'2016-02-16 14:55:43.000000'}, 
       ] 
       }, 
     type: 'POST' 
    }) 
    .error(function(r){}) 
    .success(function(data){}) 
}); 

इस डेटा पोस्टिंग पर, मैं GameSerializer भीतर बनाने के विधि में लगता है कि validate_data.pop ('माप') इसमें 3 आदेशित शब्दकोशों (ऑर्डर्ड डिक्ट()) की एक सूची है जो खाली हैं।

अद्यतन: मैं पाया है कि request.data द्वारा आने initial_data इसलिए की तरह संरचित है:

'emotion_measurements[0][measurement_type]' (4397175560) = {list} ['type1'] 
'emotion_measurements[0][measurement]' (4397285512) = {list} ['71'] 
'emotion_measurements[0][timestamp]' (4397285600) = {list} ['2016-02-16 14:53:43.000000'] 
'emotion_measurements[1][measurement_type]' (4397175040) = {list} ['type1'] 
'emotion_measurements[1][measurement]' (4397285864) = {list} ['72'] 
'emotion_measurements[1][timestamp]' (4397285952) = {list} ['2016-02-16 14:54:43.000000'] 
'emotion_measurements[2][measurement_type]' (4397175040) = {list} ['type1'] 
'emotion_measurements[2][measurement]' (4397285864) = {list} ['73'] 
'emotion_measurements[2][timestamp]' (4397285952) = {list} ['2016-02-16 14:55:43.000000'] 

किसी को भी पहले इस समस्या का सामना करना पड़ा है? धन्यवाद!

अद्यतन # 2

मैं इस को हल करने (हालांकि मेरा मानना ​​है कि यह एक समाधान की तुलना में एक समाधान के अधिक है) मेरी MeasurementSerializer के लिए निम्न जोड़कर कर रहा था:

def to_internal_value(self, data): 
     formatted_data = json.dumps(data) 
     formatted_data = formatted_data.replace("[", "").replace("]","") 
     formatted_data = json.loads(formatted_data) 
     return formatted_data 

मापन डेटा आ रहा जब मैं मानता हूं कि मुझे डिक्ट की जरूरत है तो एक प्रश्नोत्तरी थी। कुंजी और मूल्यों के आस-पास कुछ अतिरिक्त ब्रैकेट भी थे इसलिए मुझे उन्हें भी हटाना पड़ा।

अभी भी इससे बेहतर जवाब मांगना!

+1

क्या आप 'self.initial_data.get (' माप ') में क्या देख सकते हैं? और, बस सुरक्षित पक्ष पर रहने के लिए: जांचें कि आपके सर्वर को JSON क्या प्राप्त हुआ है। (आपका AJAX कोड ठीक दिखता है और यह निश्चित रूप से सर्वर के रूप में निश्चित रूप से पहुंचता है - लेकिन अच्छी तरह से ...) – Risadinha

+0

एकमात्र ऐसा लगता है कि मैं आपके कोड को कई बार देखने के बाद पा सकता हूं कि शायद (शायद!) आपका टाइमस्टैम्प विश्लेषण करने में विफल रहता है आपके पैटर्न के लिए। मुझे कुछ और नहीं मिल रहा है, मेरे स्वयं के धारावाहिकों और डीआरएफ उदाहरण की तुलना में भी। चूंकि टाइमस्टैम्प वैकल्पिक है, बस यह सुनिश्चित करने के लिए, इन मानों के बिना इसका परीक्षण करें।लेकिन अगर यह समस्या है, तो सवाल यह होगा कि आप सत्यापन त्रुटियों को क्यों नहीं देख रहे हैं। – Risadinha

+0

@Risadinha मैंने प्रारंभिक_डेटा संरचना के साथ अद्यतन किया है। संरचना एक QueryDict है, जो मैं बहुत परिचित नहीं हूँ। मेरे पास विचार करने की एक ही ट्रेन थी जिसमें टाइमस्टैम्प की आवश्यकता नहीं थी, यदि यह दिनांक समय स्वरूपण मुद्दा था लेकिन फिर भी वही समस्या थी। –

उत्तर

0

यहां समस्या सामने की तरफ है। डिफ़ॉल्ट रूप से सर्वर application/x-www-form-urlencoded के रूप में और ताकि इसे समझने के लिए में डेटा की व्याख्या है कि आप इसे एक json भेज रहे हैं, तो आप अपने $.ajax अनुरोध में contentType निर्दिष्ट करना होगा:

$.ajax({ 
    url: base_url + '/games/', 
    dataType: "json", 
    data: {...}, 
    contentType: 'application/json; charset=UTF-8', // add this line 
    type: 'POST' 
}) 
.error(function(r){}) 
.success(function(data){}); 
अब

अपने validated_data.pop('measurements') की create() विधि में अपने GameSerializer को अपने measurements के साथ तीन ऑब्जेक्ट्स मिलनी चाहिए (लेकिन अपडेट # 2 से अपने कामकाज को फिर से शुरू करना न भूलें)।

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