জ্যাঙ্গোতে `সম্পর্কিত_নাম` কী ব্যবহৃত হয়?


390

related_nameঅন ManyToManyFieldএবং ForeignKeyফিল্ডগুলির জন্য কী যুক্তি কার্যকর ? উদাহরণস্বরূপ, নিম্নলিখিত কোড দেওয়া, এর প্রভাব কি related_name='maps'?

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))

12
@ ড্যানিয়েলরোজম্যান যখন পিছনের সম্পর্কের প্রয়োজন হয় না তখন সম্পর্কিত_ নাম = '+' ব্যবহার করা কোনওভাবেই পারফরম্যান্স বা ভাল অনুশীলনের পক্ষে ভাল?
লাজার

10
আমি @ লাজারের প্রশ্নের উত্তর জানতে আগ্রহী হব।
3cheesewheel

1
@ লাজেরে - আমি ধরে নিই যে পারফরম্যান্সটি মোটেই বদলাবে না। আমি এটি একবার FeinCMS সামগ্রী ধরণের সাথে ব্যবহার করতে হয়েছিল। আমি ব্যক্তিগতভাবে মনে করি এটি সর্বদা নির্দিষ্ট করা ভাল অনুশীলন related_nameতাই আপনি যদি জানেন যে আপনি এটি ব্যবহার করবেন না, আমি অনুমান করি এটি একটি ভাল জিনিস। এটি অবশ্যই একটি ব্যক্তিগত মতামত।
ফ্রান্সোইস কনস্ট্যান্ট

@ 3cheeseheel এটি এখন ডক্সে রয়েছে : docs.djangoproject.com/en/2.0/ref/models/fields/…+ মানে বিপরীত সম্পর্ক তৈরি করবেন না
পি। মায়ার নূর

উত্তর:


529

related_nameঅ্যাট্রিবিউট থেকে বিপরীত সম্পর্ক নাম নির্দিষ্ট করে Userআপনার মডেল থেকে মডেল ফিরে।

আপনি যদি একটি নির্দিষ্ট না করেন তাহলে related_name, জ্যাঙ্গো স্বয়ংক্রিয়ভাবে প্রত্যয় সঙ্গে আপনার মডেল নাম ব্যবহার করে এক সৃষ্টি _set, উদাহরণস্বরূপ User.map_set.all()

আপনি যদি না উল্লেখ, যেমন related_name=mapsউপর Userমডেল, User.map_setএখনও কাজ করবে, কিন্তু User.maps.সিনট্যাক্স স্পষ্টত একটি বিট ক্লিনার এবং কম ক্লাঙ্কি হয়; সুতরাং উদাহরণস্বরূপ, যদি আপনার কোনও ব্যবহারকারী অবজেক্ট থাকে তবে আপনি আপনার মডেলটির সাথে সম্পর্কিত এমন সমস্ত দৃষ্টান্ত পেতে current_userব্যবহার করতে পারেন ।current_user.maps.all()Mapcurrent_user

জ্যাঙ্গো ডকুমেন্টেশন আরো বিস্তারিত জানার হয়েছে।


1
ঠিক আছে, আমি জানি এটি একটি পুরানো পোস্ট। তবে আমি কেবল এটি বের করার চেষ্টা করছি - সম্পর্কিত নামের শেষে + কৌশলটি কী? উদাহরণস্বরূপ, যদি আমি related_name='maps+'উপরের উদাহরণটিতে করি তবে কী হবে ?
সিড

10
আপনি যদি + যোগ করেন তবে
জাঙ্গো

5
ওয়ানটোওফিল্ডের জন্য ডিফল্ট সম্পর্কিত_নাম ছোট ছোট শ্রেণীর নাম হবে। প্রদত্ত উদাহরণে উদাহরণস্বরূপ যদি সদস্যরা ওয়ানটোওফিল্ড হয় তবে "ব্যবহারকারী.ম্যাপ" কাজ করবে।
এনচো

যদি আপনি নির্দিষ্ট related_nameকরেন তবে _setএখনও কাজ করে django1.11 >??
এসির কিংস

9
আমি জ্যাঙ্গো ২.১.৩ ব্যবহার করি এবং আমি সেগুলি একচেটিয়াভাবে খেয়াল করতে পারি। একবার related_nameনির্দিষ্ট করা হয়, _setআর কাজ করে না।
stockersky

82

বিদ্যমান উত্তরে যুক্ত করতে - সম্পর্কিত নামটি একই টেবিলের দিকে নির্দেশিত মডেলের 2 এফকে ক্ষেত্রে অবশ্যই আবশ্যক। উদাহরণস্বরূপ, বিল এর সামগ্রীর ক্ষেত্রে

@with_author 
class BOM(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    tomaterial =  models.ForeignKey(Material, related_name = 'tomaterial')
    frommaterial =  models.ForeignKey(Material, related_name = 'frommaterial')
    creation_time = models.DateTimeField(auto_now_add=True, blank=True)
    quantity = models.DecimalField(max_digits=19, decimal_places=10)

সুতরাং যখন আপনাকে এই ডেটা অ্যাক্সেস করতে হবে আপনি কেবলমাত্র সম্পর্কিত নাম ব্যবহার করতে পারেন

 bom = material.tomaterial.all().order_by('-creation_time')

এটি অন্যথায় কাজ করছে না (কমপক্ষে আমি 2 টি এফকে একই টেবিলে সম্পর্কিত নামের ব্যবহারটি এড়িয়ে যেতে পারিনি।)


2
কমপক্ষে তাদের একটির জন্য আপনাকে একটি সম্পর্কিত_নাম বেছে নিতে হবে। অন্য একটিকে পুরোপুরি প্রয়োজন হয় না।
সিএসবা তোথ

32
related_nameবহুবচন হওয়া উচিত। কারণ ফরেনকি সম্পর্কগুলি একাধিক বস্তু ফেরত দেয়।
মেসুত তাস্কি

10

related_nameযুক্তি আপনি আরো জটিল সংশ্লিষ্ট বর্গ নাম আছে যদি এছাড়াও দরকারী। উদাহরণস্বরূপ, যদি আপনার একটি বিদেশী কী সম্পর্ক থাকে:

class UserMapDataFrame(models.Model):
    user = models.ForeignKey(User) 

UserMapDataFrameসম্পর্কিত থেকে অবজেক্ট অ্যাক্সেস করার জন্য User, ডিফল্ট কলটি হত User.usermapdataframe_set.all(), যা এটি পড়া বেশ কঠিন।

related_nameবিপরীত সম্পর্ক পেতে আপনাকে আরও সহজ বা আরও সুস্পষ্ট নাম নির্দিষ্ট করার অনুমতি দেয় Using এই ক্ষেত্রে, যদি আপনি উল্লেখ করেন user = models.ForeignKey(User, related_name='map_data'), কলটি তখন হবে User.map_data.all()


3

সম্পর্কিত নামের প্যারামিটারটি আসলে একটি বিকল্প। যদি আমরা এটি সেট না করি, জ্যাঙ্গো স্বয়ংক্রিয়ভাবে আমাদের জন্য সম্পর্কের অন্য দিকটি তৈরি করে। মানচিত্রের মডেলটির ক্ষেত্রে, জ্যাঙ্গো একটি map_setবৈশিষ্ট্য তৈরি করত , যা m.map_setআপনার উদাহরণের মাধ্যমে অ্যাক্সেসের অনুমতি দেয় (আমি আপনার শ্রেণীর উদাহরণ হিসাবে রয়েছি)। জ্যাঙ্গো যে সূত্রটি ব্যবহার করে তা হ'ল স্ট্রিংয়ের পরে মডেলটির নাম _set। সম্পর্কিত নামের প্যারামিটারটি এভাবে নতুন আচরণ সরবরাহ করার চেয়ে জ্যাঙ্গোর ডিফল্টটিকে কেবল ওভাররাইড করে।


0

prefetch_relatedপ্রিফেচ ডেটা ব্যবহার করে অনেকের কাছে অনেকের কাছে এবং অনেকের কাছে একটি সম্পর্কিত ডেটা। select_relatedএকটি একক মান সম্পর্ক থেকে ডেটা নির্বাচন করা হয়। এই দু'টিই কোনও মডেল থেকে তাদের সম্পর্ক থেকে ডেটা আনতে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি একটি মডেল এবং এমন একটি মডেল তৈরি করেন যা অন্য মডেলের সাথে সম্পর্ক রাখে। যখন একটি অনুরোধ আসে আপনি তাদের সম্পর্কের ডেটা সম্পর্কেও জিজ্ঞাসা করবেন এবং জ্যাঙ্গোর কাছে তাদের সম্পর্কের ডেটা অ্যাক্সেস করার জন্য খুব ভাল প্রক্রিয়া রয়েছে book.author.nameতবে আপনি যখন তাদের সম্পর্কের ডেটা আনার জন্য মডেলের একটি তালিকা পুনরাবৃত্তি করেন তখন জাঙ্গো প্রতিটি একক সম্পর্কের ডেটার জন্য প্রতিটি অনুরোধ তৈরি করে। এটি কাটিয়ে উঠতে আমাদের আছে prefetchd_relatedএবংselected_related

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