2015-09-28 5 views
6

पर मैपिंग सीरियलाइज़र फ़ील्ड मैपिंगो डीजीगो रेस्ट फ्रेमवर्क प्रोजेक्ट से निपट रहा हूं और मेरे दृश्य के लिए सामान्य प्रतिक्रिया यह नहीं है कि ऐप क्लाइंट की अपेक्षा क्या है।Django Rest Framework - डेटाबेस कॉलम नाम

ऐप क्लाइंट उम्मीद करता है कि संबंधित मॉडल का दायर डेटाबेस के रूप में दिखाई देता है। उदाहरण दिया गया: मॉडल सिटी में देश मॉडल के लिए एक विदेशी कुंजी है, जो देश_आईडी कॉलम द्वारा दर्शायी जाती है।

क्या धारावाहिक डिफ़ॉल्ट फ़ील्ड को "कस्टम" करने के लिए कोई विकल्प है? मैंने Django Rest Framework दस्तावेज़ीकरण की जांच की है लेकिन मुझे केवल "serializer_field_mapping" मिला है, लेकिन मुझे नहीं पता कि यह मेरी आवश्यकताओं के अनुरूप होगा या नहीं, मुझे यह भी नहीं पता कि इसका उपयोग कैसे किया जाए।

किसी भी तरह से मुझे इसका नज़दीक दृष्टिकोण मिला, लेकिन केवल डेटा लाने के मामले में - क्रिएटिंग/अपडेटिंग ने कुछ त्रुटियों को फेंक दिया जो मुझे प्रबंधित नहीं किया गया था। :(

मैं अपने मॉडल.py फ़ाइल, साथ ही वास्तविक आउटपुट और वांछित आउटपुट संलग्न करता हूं। साथ ही, यदि यह संभव है, तो मैं डेटाबेस कॉलम के साथ संयुक्त मौजूद होने पर देश/क्षेत्र से संबंधित डेटा पुनर्प्राप्त करना चाहता हूं FIELD_ID नाम।

अग्रिम धन्यवाद,

models.py

from django.db import models 
from django.contrib.postgres.fields import ArrayField 


class Country(models.Model): 

    name = models.CharField(max_length=150, unique=True, blank=False) 

    class Meta: 
     db_table = 'countries' 


class Region(models.Model): 

    name = models.CharField(max_length=150, unique=True, blank=False) 
    code = models.CharField(max_length=150, blank=True) 

    class Meta: 
     db_table = 'regions' 


class City(models.Model): 

    country = models.ForeignKey(Country) 
    region = models.ForeignKey(Region, null=True, blank=True, default=None) 
    name = models.CharField(max_length=150, unique=True, blank=False) 
    postal_codes = ArrayField(models.CharField(max_length=12, blank=True), null=True, blank=True, default=None) 

    def __str__(self): 
     if not self.region: 
      return '%s (%s)' % (self.name, self.country.name) 
     return '%s, %s (%s)' % (self.name, self.region.name, self.country.name) 

    class Meta: 
     db_table = 'cities' 

वास्तविक कहां tput:

[ 
    { 
    "id": 1, 
    "name": "San Francisco", 
    "postal_codes": null, 
    "country": 1, 
    "region": 1 
    }, 
    { 
    "id": 2, 
    "name": "Palo Alto", 
    "postal_codes": null, 
    "country": 1, 
    "region": 1 
    }, 
    { 
    "id": 3, 
    "name": "New York City", 
    "postal_codes": null, 
    "country": 1, 
    "region": 2 
    }, 
    { 
    "id": 4, 
    "name": "London", 
    "postal_codes": null, 
    "country": 2, 
    "region": null 
    } 
] 

वांछित आउटपुट:

[ 
    { 
    "id": 1, 
    "country_id": 1, 
    "region_id": 1, 
    "name": "San Francisco", 
    "postal_codes": null 
    }, 
    { 
    "id": 2, 
    "country_id": 1, 
    "region_id": 1, 
    "name": "Palo Alto", 
    "postal_codes": null 
    }, 
    { 
    "id": 3, 
    "country_id": 1, 
    "region_id": 2, 
    "name": "New York City", 
    "postal_codes": null 
    }, 
    { 
    "id": 4, 
    "country_id": 2, 
    "region_id": null, 
    "name": "London", 
    "postal_codes": null 
    } 
] 

उत्तर

2

सभी के लिए धन्यवाद। आखिरकार मुझे मिल गया। कोड देखें। उत्तर प्रश्न पर बड़ी मात्रा में लाइनों को जोड़ने का कोई विकल्प नहीं है, इसलिए मैं अपने प्रश्न का उत्तर देता हूं।

serializers.py

from rest_framework import serializers 
from .models import Country, Region, City 


class CountrySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Country 
     fields = ('id', 'name') 


class RegionSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Region 
     fields = ('id', 'name', 'code') 


class CitySerializer(serializers.ModelSerializer): 

    country_id = serializers.PrimaryKeyRelatedField(
     queryset=Country.objects.all(), 
     required=True, 
     source='country', 
    ) 
    region_id = serializers.PrimaryKeyRelatedField(
     queryset=Region.objects.all(), 
     allow_null=True, 
     required=False, 
     source='region', 
    ) 

    country = CountrySerializer(
     read_only=False, 
     required=False, 
    ) 
    region = RegionSerializer(
     required=False, 
     allow_null=True, 
     read_only=True, 
    ) 

    class Meta: 
     model = City 
     fields = (
      'id', 
      'country', 'region', 
      'name', 'postal_codes', 
      'country_id', 'region_id', 
     ) 
5

आप इस लक्ष्य को हासिल करने के लिए अपने serializer पर एक क्षेत्र के source पैरामीटर का उपयोग कर सकते हैं। उदाहरण के लिए:

from rest_framework import serializers 

from .models import City 


class CitySerializer(serializers.ModelSerializer): 
    country_id = serializers.IntegerField(source='country') 
    region_id = serializers.IntegerField(source='region') 

    class Meta: 
     model = City 
     fields = ('id', 'country_id', 'region_id', 'name', 'postal_codes') 

संपादित करें: यारोस्लाव के रूप में बताया, जब यह इस तरह से कर रही है, आप source शामिल करने की ज़रूरत नहीं है। ध्यान दें, हालांकि, सूची में बस country_id या region_id समेत पर्याप्त नहीं है। आपको अभी भी धारावाहिक पर फ़ील्ड निर्दिष्ट करने की आवश्यकता है, जैसे कि country_id = serializers.IntegerField() और इसे fields में भी शामिल करें।

+0

यह ओपी प्रतीत नहीं होता है, क्योंकि वह 'country_id' और' region_id' में आईडी करना चाहती है 'source', की जरूरत है। –

+0

निश्चित रूप से, लेकिन यह कुछ django आराम फ्रेमवर्क डिफ़ॉल्ट सत्यापन प्रदान नहीं करेगा। 'POST/cities/{name: San José, country_id: 999999}' 'ईटीग्रिटी एरर/सिटी/डालने या अपडेट पर अपडेट' के साथ एक HTML प्रदान करेगा "शहरों" विदेशी कुंजी बाधा का उल्लंघन करता है "cities_country_id_2cc874aa51973821_fk_countries_id" विवरण: कुंजी (country_id) = (99 9) तालिका "देशों" में मौजूद नहीं है। 'और डेटाबेस तालिका की बाधाओं के साथ भी ऐसा ही होगा। – jordimarinvalle

+0

@ JordiMarínValle उपयोग ['PrimaryKeyRelatedField'] (http: //www.django-rest-framework।'इंटीजरफ़िल्ल्ड' के बजाय संगठन/एपीआई-गाइड/रिलेशनशिप/# प्राथमिककीसंबंधित क्षेत्र)। –