জ্যাঙ্গোতে কীভাবে একের মধ্যে একাধিক সম্পর্ক প্রকাশ করা যায়


167

আমি এখনই আমার জ্যাঙ্গো মডেলগুলি সংজ্ঞায়িত করছি এবং আমি বুঝতে পেরেছিলাম যে OneToManyFieldমডেল ফিল্ডের ধরণগুলির মধ্যে একটি নেই । আমি নিশ্চিত যে এটি করার উপায় আছে তাই আমি কী অনুপস্থিত তা নিশ্চিত নই। আমার কাছে মূলত এরকম কিছু রয়েছে:

class Dude(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

class PhoneNumber(models.Model):
    number = models.CharField()

এই ক্ষেত্রে, প্রতিটি Dudeএকাধিক থাকতে পারে PhoneNumberগুলি কিন্তু সম্পর্ক, একমুখী হওয়া উচিত যে আমি থেকে জানি প্রয়োজন হবে না PhoneNumberযা Dudeএটা মালিক, কোনটাই, আমি বিভিন্ন বস্তু থাকতে পারে যে নিজের PhoneNumberযেমন একটি হিসাবে দৃষ্টান্ত, Businessজন্য উদাহরণ:

class Business(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

OneToManyFieldএই ধরণের সম্পর্কের প্রতিনিধিত্ব করার জন্য আমি মডেলটির সাথে কী (যার অস্তিত্ব নেই) প্রতিস্থাপন করব ? আমি হাইবারনেট / জেপিএ থেকে আসছি যেখানে একের মধ্যে একাধিক সম্পর্কের কথা ঘোষণা করা এতটা সহজ ছিল:

@OneToMany
private List<PhoneNumber> phoneNumbers;

জাজানোতে আমি কীভাবে এটি প্রকাশ করতে পারি?

উত্তর:


133

জাজানোতে একের সাথে একাধিক সম্পর্ক পরিচালনা করতে আপনাকে ব্যবহার করতে হবে ForeignKey

ফরেনকে-তে ডকুমেন্টেশন খুব বিস্তৃত এবং আপনার সমস্ত প্রশ্নের উত্তর দেওয়া উচিত:

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

আপনার উদাহরণের বর্তমান কাঠামোটি প্রতিটি ডুডের একটি করে সংখ্যা এবং প্রতিটি সংখ্যা একাধিক ডিউডের (ব্যবসায়ের সাথে একই) থাকতে দেয়।

যদি আপনি বিপরীত সম্পর্ক চান তবে আপনার ফোননম্বরের মডেলটিতে দুটি ফরেনকে ক্ষেত্র যুক্ত করতে হবে, একটি ডডে এবং একটিতে ব্যবসায় to এটি প্রতিটি নম্বরকে একটি ডড বা একটি ব্যবসায়ের অন্তর্ভুক্ত করার অনুমতি দেবে এবং ডিউডস এবং ব্যবসায় একাধিক নম্বরের মালিক হতে সক্ষম হবে। আমি মনে করি এটি আপনার পরে যা হতে পারে।

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)

3
উপরের সমস্যাটি দেখে আপনি কি আমাকে একটি উদাহরণ দিতে পারেন? আমি সম্ভবত এটি সম্পূর্ণরূপে মিস করছি তবে আমি কিছু সময়ের জন্য জ্যাঙ্গো ডকুমেন্টেশনটি পড়ছি এবং এই জাতীয় সম্পর্ক কীভাবে তৈরি করা যায় সে সম্পর্কে এখনও অস্পষ্ট।
নাফটুলি কে

4
উভয়ই বিদেশী কীগুলি প্রয়োজনীয় নয় (ফাঁকা = সত্য, নাল = সত্য) তৈরি করতে বা কমপক্ষে একটি বা অন্যটি রয়েছে কিনা তা নিশ্চিত করার জন্য কিছু প্রকারের কাস্টম বৈধতা যুক্ত করতে চাইতে পারে। জেনেরিক নম্বরযুক্ত ব্যবসায়ের ক্ষেত্রে কী হবে? না বেকার বাবু?
j_syk

1
@ j_syk কাস্টম বৈধতা সম্পর্কে ভাল পয়েন্ট। তবে এটি হ্যাকির মতো মনে হয় যে বিদেশী মানুষকে বিদেশী করা এবং বিদেশী লোককে ব্যবসায়ের সাথে অন্তর্ভুক্ত করা এবং তারপরে কাস্টম (মডেল সংজ্ঞায় বহিরাগত) বৈধকরণ করা। মনে হচ্ছে একটি পরিষ্কার উপায় থাকতে হবে, তবে আমি এটিও বুঝতে পারি না।
অ্যান্ডি

এই পরিস্থিতিতে কনটেন্টটাইপস ফ্রেমওয়ার্ক ব্যবহার করা উপযুক্ত যা বিভিন্ন বস্তুর সাথে জেনেরিক সম্পর্কের মঞ্জুরি দেয়। তবে বিষয়বস্তুর ধরণগুলি ব্যবহার করা খুব দ্রুত জটিল হয়ে উঠতে পারে এবং এটি যদি আপনার একমাত্র প্রয়োজন হয় তবে এই সহজ (যদি হ্যাকি হয়) পন্থাটি কাম্য হতে পারে।
kball

57
একটি প্রাসঙ্গিক বিষয় উল্লেখ করার জন্য হ'ল বিদেশ সম্পর্কিত "যুক্ত_নামক" যুক্তি। সুতরাং আপনি যে ফোননম্বার ক্লাসে থাকতেন dude = models.ForeignKey(Dude, related_name='numbers')এবং তারপরে আপনি some_dude_object.numbers.all()সমস্ত সম্পর্কিত নম্বর পেতে ব্যবহার করতে পারেন (আপনি যদি "সম্পর্কিত_নাম" নির্দিষ্ট না করেন তবে এটি "নম্বর_সেট" এ ডিফল্ট হয়ে যাবে)।
মার্কশিপ

40

জ্যাঙ্গোতে একের সাথে একাধিক সম্পর্ককে ফরেনকে বলা হয়। এটি কেবলমাত্র এক দিকেই কাজ করে তবে numberশ্রেণির কোনও বৈশিষ্ট্য না রেখে বরং Dudeআপনার প্রয়োজন হবে

class Dude(models.Model):
    ...

class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)

অনেক মডেল একটি থাকতে পারে ForeignKeyঅন্য একটি মডেল, তাই এটি একটি দ্বিতীয় অ্যাট্রিবিউট আছে বৈধ হতে হবে PhoneNumberযে এই ধরনের

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)

আপনি অ্যাক্সেস করতে পারেন PhoneNumberএকটি জন্য গুলি Dudeবস্তুর dসঙ্গে d.phonenumber_set.objects.all(), এবং তারপর একটি জন্য একভাবে না Businessঅবজেক্ট।


1
আমি অনুমানের মধ্যে ছিলাম যার ForeignKeyঅর্থ "ওয়ান-টু ওয়ান"। আপনার উপরোক্ত উদাহরণে ব্যবহার করে, আমি একটি থাকতে হবে Dudeঅনেক আছে PhoneNumbersঠিক আছে?
নাফটুলি কে

6
এটি প্রতিফলিত করার জন্য আমি আমার উত্তর সম্পাদনা করেছি। হ্যাঁ. ForeignKeyযদি আপনি নির্দিষ্ট করেন তবে কেবলমাত্র এক-এক-তে ForeignKey(Dude, unique=True)তাই উপরের কোডের সাথে আপনি Dudeএকাধিক PhoneNumberএস সহ একটি পাবেন ।
এখনও

1
@ রোলিং পাথর- আপনাকে ধন্যবাদ, আমি মন্তব্য করার সাথে সাথে আমার ভুলটি উপলব্ধি করার পরে যোগ করেছিলাম that ইউনিক = ট্রু ঠিক ওয়ানটোওফিল্ডের মতো কাজ করে না, আমি বোঝাতে চাইছিলাম যে আপনি ইউনিক = ট্রু নির্দিষ্ট করলে ফরেনকি কেবলমাত্র এক থেকে একের সম্পর্ককে ব্যবহার করে।
এখনও

8
এটির জন্য +1 করুন PhoneNumber। এখন এটি বোধ করা শুরু হয়। ForeignKeyমূলত একাধিক টু ওয়ান, তাই এক-একাধিক পেতে আপনার এটি পিছনের দিকে করা দরকার :)
নাফটুলি কে

2
মাঠের নামটির তাৎপর্য কি কেউ ব্যাখ্যা করতে পারেন phonenumber_set? আমি এটি কোথাও সংজ্ঞায়িত দেখতে পাচ্ছি না। এটি কি মডেলটির নাম, সমস্ত নিম্ন ক্ষেত্রে, "_set" যুক্ত?
জেমস ওয়েয়ারজবা

20

আরও পরিষ্কার করে বলা যায় - জ্যাঙ্গোতে ওয়ানটোমেনি নেই, কেবল ম্যান্টিটোইন - যা উপরে বর্ণিত ফরেনকি। আপনি ফরেনকি ব্যবহার করে ওয়ানটোম্যানির সম্পর্ক বর্ণনা করতে পারেন তবে এটি অত্যন্ত অনভিজ্ঞতার সাথে।

এটি সম্পর্কে একটি ভাল নিবন্ধ: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-referenceship-in-django/


আপনি ম্যান্টিটোম্যানিফিল্ড ব্যবহার করতে পারেন।
ব্যবহারকারী 5510975

15

আপনি সম্পর্কের অনেক দিকে বিদেশী কী ব্যবহার করতে পারেন OneToMany(যেমন ManyToOneসম্পর্ক) বা ManyToManyঅনন্য সীমাবদ্ধতার সাথে (যে কোনও দিকে) ব্যবহার করতে পারেন ।


8

djangoযথেষ্ট স্মার্ট। আসলে আমাদের oneToManyক্ষেত্র সংজ্ঞা দেওয়ার দরকার নেই । এটি স্বয়ংক্রিয়ভাবে আপনার দ্বারা উত্পাদিত হবে django:-)। আমাদের কেবলমাত্র foreignKeyসম্পর্কিত সারণিতে সংজ্ঞা দেওয়া দরকার । অন্য কথায়, আমাদের কেবল ManyToOneব্যবহার করে সম্পর্কের সংজ্ঞা দেওয়া দরকার foreignKey

class Car(models.Model):
    // wheels = models.oneToMany() to get wheels of this car [**it is not required to define**].


class Wheel(models.Model):
    car = models.ForeignKey(Car, on_delete=models.CASCADE)  

যদি আমরা নির্দিষ্ট গাড়ির চাকার তালিকা পেতে চাই। আমরা python'sস্বয়ংক্রিয় উত্পন্ন বস্তু ব্যবহার করব wheel_set। গাড়ির জন্য cআপনি ব্যবহার করবেc.wheel_set.all()


5

পাথরটির উত্তোলনটি ভাল, সরল ও কার্যকরী হলেও , আমি মনে করি দুটি বিষয় রয়েছে যা এর সমাধান করে না।

  1. ওপি যদি কোনও ফোন নম্বর প্রয়োগ করতে চায় তবে তারা কোনও বংশোদ্ভূত এবং ব্যবসায় উভয়েরই হতে পারে না
  2. ডোন / বিজনেস মডেলগুলিতে নয়, ফোন নাম্বার মডেলটিতে সম্পর্ক সংজ্ঞায়নের ফলস্বরূপ দুঃখের অদম্য অনুভূতি। অতিরিক্ত টেরেস্ট্রিয়াল যখন পৃথিবীতে আসে, এবং আমরা একটি এলিয়েন মডেল যুক্ত করতে চাই, আমাদের কেবল এলিয়েন মডেলটিতে একটি "ফোন_ নাম্বার" ক্ষেত্র যুক্ত করার পরিবর্তে ফোন নাম্বার (ইটিগুলির ফোন নম্বর রয়েছে বলে ধরে নেওয়া) পরিবর্তন করতে হবে।

পরিচয় দিন সামগ্রী প্রকার ফ্রেমওয়ার্ক , যা কিছু বস্তু যা আমাদের PHONENUMBER মডেলের উপর একটি "জেনেরিক বিদেশী কী" তৈরি করার অনুমতি দেয় অনাবৃত। তারপরে, আমরা ডুড এবং বিজনেসের বিপরীত সম্পর্কের সংজ্ঞা দিতে পারি

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models

class PhoneNumber(models.Model):
    number = models.CharField()

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    owner = GenericForeignKey()

class Dude(models.Model):
    numbers = GenericRelation(PhoneNumber)

class Business(models.Model):
    numbers = GenericRelation(PhoneNumber)

বিশদগুলির জন্য ডকগুলি দেখুন এবং দ্রুত টিউটোরিয়ালটির জন্য সম্ভবত এই নিবন্ধটি দেখুন

এছাড়াও, এখানে একটি নিবন্ধ যা জেনেরিক এফকে ব্যবহারের বিরুদ্ধে তর্ক করে


0

যদি "অনেকগুলি" মডেল প্রতি-সে-মডেল তৈরির ন্যায্যতা না জানায় (এখানে কেস হয় না তবে এটি অন্য লোকের পক্ষে উপকৃত হতে পারে), অন্য বিকল্প হতে পারে জ্যাঙ্গো কন্ট্রিবিব প্যাকেজের মাধ্যমে নির্দিষ্ট পোস্টগ্রাইএসকিউএল ডেটা ধরণের উপর নির্ভর করা would

পোস্টগ্র্রেস অ্যারে বা জেএসওন ডেটা ধরণের সাথে মোকাবেলা করতে পারে এবং ওয়ান-টু-মন্টল পরিচালনা করার জন্য এটি দুর্দান্ত কাজ হতে পারে যখন বহু-য় শুধুমাত্র একটির একক সত্তার সাথে আবদ্ধ হতে পারে

পোস্টগ্রিস আপনাকে অ্যারের একক উপাদানগুলিতে অ্যাক্সেস করার অনুমতি দেয়, যার অর্থ क्वेরিগুলি সত্যই দ্রুত হতে পারে এবং অ্যাপ্লিকেশন-স্তরের ওভারহেডগুলি এড়াতে পারে। এবং অবশ্যই, জ্যাঙ্গো এই বৈশিষ্ট্যটি উপকারের জন্য একটি দুর্দান্ত API প্রয়োগ করে

স্পষ্টতই এটির অন্যদের ডাটাবেস ব্যাকএন্ডে পোর্টেবল না হওয়ার অসুবিধা রয়েছে, তবে আমি এটি উল্লেখ করার মতোই থাকি।

আশা করি এটি কিছু লোকের ধারণা অনুসন্ধানে সহায়তা করতে পারে।


0

সবার আগে আমরা একটি ভ্রমণ করি:

01) একের সাথে একাধিক সম্পর্ক:

ASSUME:

class Business(models.Model):
    name = models.CharField(max_length=200)
    .........
    .........
    phone_number = models.OneToMany(PhoneNumber) (NB: Django do not support OneToMany relationship)

class Dude(models.Model):
    name = models.CharField(max_length=200)
    .........
    .........
    phone_number = models.OneToMany(PhoneNumber) (NB: Django do not support OneToMany relationship)

class PhoneNumber(models.Model):
    number = models.CharField(max_length=20)
    ........
    ........

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

এখানে:

রিলেশনাল মডেল = ওয়ানটোম্যানি

সুতরাং, বিপরীত সম্পর্কযুক্ত মডেল = ম্যান্টিওওন

এনবি: জাজাঙ্গো ম্যান্টিও টোইন সম্পর্ককে সমর্থন করে এবং জ্যাঙ্গোতে ম্যানেজটো ওনকে ফরেনকি দ্বারা প্রতিনিধিত্ব করা হয়।

02) একাধিক টু ওয়ান সম্পর্ক:

SOLVE:

class Business(models.Model):
    .........
    .........

class Dude(models.Model):
    .........
    .........

class PhoneNumber(models.Model):
    ........
    ........
    business = models.ForeignKey(Business)
    dude = models.ForeignKey(Dude)

এনবি: ভাবুন সরল !!

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