জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কের প্রতিক্রিয়াগুলিতে মধ্যস্থতাকারী (মডেলের মাধ্যমে) অন্তর্ভুক্ত করুন


110

আমার কাছে m2m / মডেলগুলির সাথে ডিলিং এবং জ্যাঙ্গো বিশ্রাম কাঠামোয় তাদের উপস্থাপনা সম্পর্কে প্রশ্ন রয়েছে। আসুন একটি সর্বোত্তম উদাহরণ নেওয়া যাক:

models.py:

from django.db import models

class Member(models.Model):
    name = models.CharField(max_length = 20)
    groups = models.ManyToManyField('Group', through = 'Membership')

class Group(models.Model):
    name = models.CharField(max_length = 20)

class Membership(models.Model):
    member = models.ForeignKey('Member')
    group = models.ForeignKey('Group')
    join_date = models.DateTimeField()

serializers.py:

imports...

class MemberSerializer(ModelSerializer):
    class Meta:
        model = Member

class GroupSerializer(ModelSerializer):
    class Meta:
        model = Group

views.py:

imports...

class MemberViewSet(ModelViewSet):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

class GroupViewSet(ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

যখন সদস্যের উদাহরণ পাওয়া যায়, তখন আমি সফলভাবে সদস্যের সমস্ত ক্ষেত্র এবং তার গোষ্ঠীগুলি সাফল্যের সাথে গ্রহণ করি - তবে আমি কেবল সদস্যদের মডেল থেকে আসা অতিরিক্ত বিশদ ছাড়াই গোষ্ঠীর বিবরণ পাই।

অন্য কথায় আমি প্রত্যাশা করি :

{
   'id' : 2,
   'name' : 'some member',
   'groups' : [
      {
         'id' : 55,
         'name' : 'group 1'
         'join_date' : 34151564
      },
      {
         'id' : 56,
         'name' : 'group 2'
         'join_date' : 11200299
      }
   ]
}

Join_date টি নোট করুন ।

আমি এটি সম্পর্কে অবশ্যই জ্যাঙ্গো রেস্ট-ফ্রেমওয়ার্ক অফিসিয়াল পৃষ্ঠা সহ অনেকগুলি সমাধানের চেষ্টা করেছি এবং কেউই এ সম্পর্কে যথাযথ সরল উত্তর দিতে বলে মনে হচ্ছে না - এই অতিরিক্ত ক্ষেত্রগুলি অন্তর্ভুক্ত করার জন্য আমার কী করা দরকার? জ্যাঙ্গো-টেস্টিপি দিয়ে আমি এটি আরও সোজা-ফরোয়ার্ড পেয়েছি তবে কিছু অন্যান্য সমস্যা ছিল এবং বিশ্রামের কাঠামো পছন্দ করে।


চান eugene-yeo.me/2012/12/4/... সাহায্য করেছিল?
কার্তিকর

8
এটি সুস্বাদু পাইয়ের জন্য, আমি জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কের সাথে কাজ করছি।
mllm

উত্তর:


139

কেমন.....

আপনার মেম্বারশিয়ারাইজারে, এটির জন্য একটি ক্ষেত্রটি সংজ্ঞায়িত করুন:

groups = MembershipSerializer(source='membership_set', many=True)

এবং তারপরে আপনার সদস্যপদ সিরিয়ালে আপনি এটি তৈরি করতে পারেন:

class MembershipSerializer(serializers.HyperlinkedModelSerializer):

    id = serializers.Field(source='group.id')
    name = serializers.Field(source='group.name')

    class Meta:
        model = Membership

        fields = ('id', 'name', 'join_date', )

এতে সিরিয়ালযুক্ত মান, গোষ্ঠী তৈরির সামগ্রিক প্রভাব রয়েছে যা এর উত্স হিসাবে আপনি চাইছেন সদস্যতা এবং তারপরে এটি আপনার প্রদর্শিত বিটগুলি প্রদর্শন করতে একটি কাস্টম সিরিয়াল ব্যবহার করে।

সম্পাদনা: @ ব্রায়ানফের মন্তব্য অনুসারে, ডিআরএফ 3.0 এ serializers.fieldনতুন নামকরণ করা serializers.ReadOnlyFieldহয়েছিল, সুতরাং এটি পড়তে হবে:

class MembershipSerializer(serializers.HyperlinkedModelSerializer):

    id = serializers.ReadOnlyField(source='group.id')
    name = serializers.ReadOnlyField(source='group.name')

    class Meta:
        model = Membership

        fields = ('id', 'name', 'join_date', )

যে কোনও আধুনিক বাস্তবায়নের জন্য


2
তাই, আমি এর বিভিন্ন রূপ চেষ্টা করেছি এবং আমি এই কাজটি পেতে পারি না। এটি অফিসিয়াল ডক্সে নেই? সদস্যতা_সেট কোথায় সংজ্ঞায়িত করা হয়?
মাটির

3
membership_setসদস্যের জন্য ডিফল্ট সম্পর্কিত নাম -> সদস্যতা
ডাস্টিনফারিস

আমার পক্ষে কৌতুক অংশটি "সদস্যতা_সেট" নামটি আবিষ্কার করছিল। আমার কাছে একটি স্পষ্ট "সম্পর্কিত" নামবিহীন একটি মডেল ছিল, সুতরাং জ্যাঙ্গো অনেকের থেকে অনেকের ডকস পড়ে আমাকে এর নামটি অনুমান করতে হয়েছিল ।
miceno

এটি দুর্দান্ত কাজ করে, ইঙ্গিতটির জন্য ধন্যবাদ। আমি মনে করি তবে এই ক্ষেত্রে ডিআরএফ কিছুটা বিপরীত কারণ ক্লাস মেম্বার ইতিমধ্যে গ্রুপ নামে একটি এম 2 মিটার ক্ষেত্রটি সংজ্ঞায়িত করেছে এবং এই সমাধানটি সিরিয়ালটিতে ফিল্ডটিকে ওভাররাইড করে মডেলের মাধ্যমে বিপরীত সম্পর্কের দিকে নির্দেশ করতে বাধ্য করে বলে মনে হচ্ছে। আমি ডিআরএফ বাস্তবায়নের বিশদগুলিতে খুব বেশি নই, তবে সম্ভবত মডেল আত্মপরিচয় দিয়ে এটি স্বয়ংক্রিয়ভাবে হস্তান্তরিত হতে পারে। চিন্তার জন্য কিছু খাবার :)
gru

এটি ডিআরএফের সর্বশেষতম সংস্করণে কাজ করে কিনা তা নিয়ে আপনি আমাদের আপডেট করতে পারেন? অথবা কমপক্ষে বলুন আপনি কোন সংস্করণ ব্যবহার করছেন? ফিল্ড মডেলের মাধ্যমে আমি ডিআরএফ ফিরিয়ে আনতে পারি না - এটি সর্বদা আসল সম্পর্কের সাথে শেষ হয় (সদস্যতার পরিবর্তে - এটি সর্বদা গ্রুপে ফিরে আসবে)।
অ্যান্ড্রে সিজোভ

18

আমি এই সমস্যার মুখোমুখি হয়েছি এবং আমার সমাধানটি (ডিআরএফ 3.6 ব্যবহার করে) অবজেক্টটিতে সিরিয়ালাইজার মেথডফিল্ড ব্যবহার করা এবং স্পষ্টভাবে এই জাতীয় সদস্যতার টেবিলটি জিজ্ঞাসা করা ছিল:

class MembershipSerializer(serializers.ModelSerializer):
    """Used as a nested serializer by MemberSerializer"""
    class Meta:
        model = Membership
        fields = ('id','group','join_date')

class MemberSerializer(serializers.ModelSerializer):
    groups = serializers.SerializerMethodField()

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

    def get_groups(self, obj):
        "obj is a Member instance. Returns list of dicts"""
        qset = Membership.objects.filter(member=obj)
        return [MembershipSerializer(m).data for m in qset]

এটি গ্রুপ কীগুলির জন্য ডিক্টের একটি তালিকা ফিরিয়ে দেবে যেখানে মেম্বারশিয়ারাইজার থেকে প্রতিটি ডিক সিরিয়ালযুক্ত হয়। এটিকে লিখনযোগ্য করে তোলার জন্য, আপনি নিজের তৈরি / আপডেট পদ্ধতিটি মেম্বারশিয়ারাইজারের ভিতরে সংজ্ঞায়িত করতে পারেন যেখানে আপনি ইনপুট ডেটার উপরে পুনরাবৃত্তি করেন এবং সদস্যতার মডেল উদাহরণগুলি স্পষ্টভাবে তৈরি বা আপডেট করেন update


-4

দ্রষ্টব্য: একটি সফটওয়্যার ইঞ্জিনিয়ার হিসাবে, আমি আর্কিটেকচারগুলি ব্যবহার করতে পছন্দ করি এবং আমি বিকাশের জন্য স্তরিত পদ্ধতির উপর গভীরভাবে কাজ করেছি তাই আমি এটির সাথে সম্মানের সাথে জবাব দেব।

আমি ইস্যুটি বুঝতে পেরেছি, এখানে সলিউশন মডেল.পি রয়েছে py

class Member(models.Model):
    member_id = models.AutoField(primary_key=True)
    member_name = models.CharField(max_length = 

class Group(models.Model):
    group_id = models.AutoField(primary_key=True)
    group_name = models.CharField(max_length = 20)
    fk_member_id = models.ForeignKey('Member', models.DO_NOTHING, 
                             db_column='fk_member_id', blank=True, null=True)

class Membership(models.Model):
    membershipid = models.AutoField(primary_key=True)
    fk_group_id = models.ForeignKey('Group', models.DO_NOTHING, 
                             db_column='fk_member_id', blank=True, null=True)
    join_date = models.DateTimeField()

serializers.py

import serializer

class AllSerializer(serializer.Serializer):
    group_id = serializer.IntegerField()
    group_name = serializer.CharField(max_length = 20)
    join_date = serializer.DateTimeField()

CustomModels.py

imports...

    class AllDataModel():
        group_id = ""
        group_name = ""
        join_date = ""

BusinessLogic.py

imports ....
class getdata(memberid):
    alldataDict = {}
    dto = []
    Member = models.Members.objects.get(member_id=memberid) #or use filter for Name
    alldataDict["MemberId"] = Member.member_id
    alldataDict["MemberName"] = Member.member_name
    Groups = models.Group.objects.filter(fk_member_id=Member)
    for item in Groups:
        Custommodel = CustomModels.AllDataModel()
        Custommodel.group_id = item.group_id
        Custommodel.group_name = item.group_name
        Membership = models.Membership.objects.get(fk_group_id=item.group_id)
        Custommodel.join_date = Membership.join_date
        dto.append(Custommodel)
    serializer = AllSerializer(dto,many=True)
    alldataDict.update(serializer.data)
    return alldataDict

আপনি প্রযুক্তিগতভাবে, ডেটা অ্যাক্সেসলিয়ারের কাছে অনুরোধটি পাস করতে হবে যা ডেটা অ্যাক্সেস লেয়ার থেকে ফিল্টার করা অবজেক্টগুলি ফিরিয়ে আনতে পারে তবে আমাকে একটি ফাস্ট ম্যানারে প্রশ্নের উত্তর দিতে হবে তাই আমি বিজনেস লজিক লেয়ারে কোডটি সামঞ্জস্য করেছি!


1
এটি সম্পূর্ণ কাস্টমাইজড অ্যাপ্রোচ যা আমি আমার বেশিরভাগ রেস্ট এপিআই বিকাশের জন্য ব্যবহার করি কারণ জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কটি বেশ নমনীয় হলেও আমি বাউন্ডের সাথে সত্যই কাজের ভক্ত নই!
সৈয়দ ফয়জান

2
এটি ইঞ্জিনিয়ারডের চেয়েও বেশি ওয়াহা, এটি ডিআরএফ এমনকি ব্যবহার করে না।
মিচাউলিলিয়াম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.