জ্যাঙ্গো আরএসইএস ফ্রেমওয়ার্কে ক্ষেত্রের নাম কীভাবে পরিবর্তন করবেন


98

আমি এসকিউএল-এর মতো ডিআরএফ সিরিয়ালাইজে মডেল ফিল্ডের নাম পরিবর্তন করার চেষ্টা করছি। আমি বিভিন্ন পদ্ধতি চেষ্টা করেছি তবে সফল হতে পারি না।

মডেল.পি

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

সিরিয়ালাইজার.পি

class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


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

আমি জ্যাঙ্গো ক্যোরিসেটে ওরফে যুক্ত করার চেষ্টা করেছি কিন্তু পরিবর্তন করা যায় না।

আপডেট হয়েছে

আমি ব্যতিক্রম এটিই am

/ ভিউনাম / 'মডিউল' অবজেক্টে অ্যাট্রিবিউটআরারের কোনও 'ক্ষেত্র' নেই

কিভাবে আমি এটি করতে পারব?


4
আপনি কি serializers.SerializerMethodFieldপদ্ধতির সঠিক বাস্তবায়ন ব্যবহার করছেন ? আমি এর অর্থ: serializers.SerializerMethodField('get_location')এবংdef get_location(self, obj): ...
এরথালিয়ন

আমরা কি আমদানি দেখতে পারি serializers.py?
জেরিক

প্রশ্নটিকে হ্রাস করবে কারণ ওপি নীচের আরও
ভালগুলির

উত্তর:


59

আপনি ব্যবহার করতে পারেন serializers.SerializerMethodField:

এখানে রয়েছে মডেল পার্ক, যার নাম এবং বিকল্প_নাম ক্ষেত্র রয়েছে।

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

পার্ক মডেল, পার্কসিরাইজারের জন্য এখানে সিরিয়ালাইজার রয়েছে। এটি বিকল্প_নামের নামটি লোকেশনে পরিবর্তন করে।

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SerializerMethodField('get_alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

    def get_alternate_name(self, obj):
        return obj.alternate_name

অতিরিক্ত হিসাবে, আপনি বৈশিষ্ট্য serializers.CharFieldসহ ব্যবহার করতে পারেন source:

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='other_fields')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

__বিদেশী কী অতিক্রম করার জন্য জ্যাঙ্গোর স্বীকৃতিটিও কাজ করে:

location = serializers.CharField(source='OtherModel__other_fields')

আপনি যদি API এ রিটার্নের ধরন পরিবর্তন করতে চান তবে একই নীতিটি প্রযোজ্য, যাতে আপনি serializers.DecimalField(source=...)এবং অন্যান্য ক্ষেত্রের প্রকারগুলিও করতে পারেন ।

এটি তবে কেবল পঠিত ক্ষেত্রের জন্যই কাজ করবে।


এখন এই ব্যতিক্রম / ভিউনামে / এ 'মডিউল' অবজেক্টে অ্যাট্রিবিউট এয়ারার নিক্ষেপ করা হচ্ছে 'সিরিয়ালাইজার মেথডফিল্ড'
শোয়েব ইজাজ

4
কিভাবে অনুরোধ তৈরি এবং সম্পাদনা করে এই ওয়ার্কআউট হবে?
আইয়ানকিট

4
পাইথনের জেনের ১৩ নং লাইনে: "এটি করার জন্য একটি - এবং পছন্দসইভাবে একমাত্র - প্রকাশ্য উপায় থাকা উচিত" "
iankit

14
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। নীচের একটিটি দেখুন, এটি আমার লেখার সময় প্রায় 5 গুণ বেশি upvotes রয়েছে।
সিডারউইন

6
এটি একটি খারাপ সমাধান। sourceনীচে বর্ণিত পরিবর্তে কোয়ার্গ ব্যবহার করুন ।
প্যাট্রিক

215

সিরিয়ালাইজার ক্ষেত্র এবং সিরিয়ালাইজারগুলিতে সাধারণভাবে 'উত্স' নামে একটি দুর্দান্ত বৈশিষ্ট্য রয়েছে যেখানে আপনি মডেল ক্ষেত্র থেকে ডেটা উত্স নির্দিষ্ট করতে পারেন।

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SomeSerializerField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

যেখানে সিরিয়ালাইজার.সোমসারিয়ালাইজারফিল্ডটি সিরিয়ালাইজার হতে পারে har আপনার মডেল যেমন পরামর্শ দেয় তেমন চরফিল্ড তবে অন্য যে কোনও একটি ক্ষেত্রের দ্বারাও তা করতে পারে। এছাড়াও আপনি পরিবর্তে সম্পর্কিত ক্ষেত্র এবং অন্যান্য সিরিয়ালাইজার রাখতে পারেন এবং এটি এখনও মনোমুগ্ধকর মতো কাজ করবে। অর্থাৎ বিকল্প_নামটি অন্য মডেলের বিদেশি ক্ষেত্র হলেও।

class ParkSerializer(serializers.ModelSerializer):
    locations = AlternateNameSerializer(source='alternate_name', many=true)

    class Meta:
        model = Park
        fields = ('other_fields', 'locations')

class AlternateNameSerializer(serializers.ModelSerialzer):
    class Meta:
        model = SomeModel

এটি অনুরোধের তৈরি, মুছে ফেলা এবং পরিবর্তনের ধরণের সাথে কাজ করে। এটি কার্যকরভাবে সিরিয়ালাইজারে ফিল্ড নেম এবং মডেলগুলির ক্ষেত্রে ফিল্ডের নামের একের ম্যাপিং তৈরি করে।


আমি রাজি হয়েছি, এটি sourceআরও সাধারণ পদ্ধতি। তবে আপনি প্রশ্নটিতে এটি ব্যবহারের কয়েকটি প্রচেষ্টা দেখতে পাচ্ছেন, সুতরাং আপনি যদি সেইভাবে উত্তর দিতে চান তবে আপনারও পরিষ্কার করে দেওয়া উচিত কেন মূল কোডটি কাজ করছে না, তাই না?
এরথালিয়ন

আপনার কোডটি
ঠিকঠাক

দুটি উত্তরই অসম্পূর্ণ। বিদেশী কী সম্পর্কিত ক্ষেত্রে, এই পদ্ধতিটি বোঝায় যে একটি নতুন পার্ক তৈরি করার সময়, আপনাকে আপনার পোষ্ট অনুরোধে ডিক হিসাবে পুরো প্যারেন্ট অবজেক্ট (বিকল্প_নাম) দিতে হবে, যা প্যারেন্ট অবজেক্টটি ইতিমধ্যে বিদ্যমান বলে পাগল। বিদেশী উদাহরণটি তার আইডির মাধ্যমে উল্লেখ করতে সক্ষম হওয়া উচিত।
স্টিলিওস 12:25

আমার ক্ষেত্রে (বিদেশী কী) আমি এই সমস্যার সমাধান করেছি locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())। দৃশ্যত RelatedFieldপাশাপাশি ব্যবহার করা যেতে পারে।
স্টিলিওস

@ শেফারভ উত্স = 'নতুন নাম' হ'ল একটি সাধারণ যুক্তি যা আপনি সিরিয়ালাইজার ক্ষেত্র, সম্পর্ক এবং অন্যান্য সম্পর্কিত সিরিয়ালাইজার ইত্যাদিকে দিতে পারেন .. আপনি কেন উত্তরটি অসম্পূর্ণ বলছেন তা নিশ্চিত নন।
iankit

15

এটি লেখার কাজগুলির জন্যও কাজ করবে

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.