জাঙ্গো: কিছু মডেল ক্ষেত্র একে অপরের সাথে সংঘর্ষ কেন করে?


174

আমি এমন একটি বস্তু তৈরি করতে চাই যাতে ব্যবহারকারীর সাথে দুটি লিঙ্ক থাকে। উদাহরণ স্বরূপ:

class GameClaim(models.Model):
    target = models.ForeignKey(User)
    claimer = models.ForeignKey(User)
    isAccepted = models.BooleanField()

তবে সার্ভারটি চালানোর সময় আমি নিম্নলিখিত ত্রুটিগুলি পাচ্ছি:

  • সম্পর্কিত ক্ষেত্র 'User.gameclaim_set' এর সাথে ক্ষেত্র 'লক্ষ্য' সংঘর্ষের জন্য অ্যাকসেসর। 'টার্গেট' এর সংজ্ঞাটিতে একটি সম্পর্কিত_নাম যুক্ত যুক্ত করুন।

  • ক্ষেত্রের 'দাবিদার' সম্পর্কিত ক্ষেত্রের সাথে সংঘর্ষকারী 'ব্যবহারকারীর নাম। ক্লেইম_সেট' hes 'দাবিদার' এর সংজ্ঞাটিতে একটি সম্পর্কিত_নাম যুক্ত যুক্ত করুন।

আমি দয়া করে ব্যাখ্যা করতে পারি কেন আমি ত্রুটিগুলি পাচ্ছি এবং সেগুলি কীভাবে সমাধান করব?


এই ত্রুটি বার্তাগুলি সত্যিই ভাল। তারা ইতিমধ্যে তাদের কীভাবে ঠিক করবেন তা ব্যাখ্যা করেছেন। এবং ** [ related_nameডকুমেন্টেশনে] ** ( ডকস.ডজ্যাঙ্গোপ্রজেক্ট / en / dev / ref / models / fields / #arguments ) পড়ার কারণে সেগুলি কেন ঘটে তা ব্যাখ্যা করবে।
লুৎজ প্রেশেল্ট

উত্তর:


294

আপনার ব্যবহারকারীর কাছে দুটি বিদেশী কী রয়েছে। জ্যাঙ্গো স্বয়ংক্রিয়ভাবে ব্যবহারকারী থেকে গেমক্লেমে ফিরে যাওয়ার বিপরীত সম্পর্ক তৈরি করে, যা সাধারণত gameclaim_set। তবে আপনার দুটি এফকে রয়েছে বলে আপনার দুটি gameclaim_setবৈশিষ্ট্য থাকবে যা অবশ্যই অসম্ভব। বিপরীত সম্পর্কের জন্য আপনাকে কী নাম ব্যবহার করতে হবে তা আপনাকে জ্যাঙ্গোকে জানাতে হবে।

related_nameএফকে সংজ্ঞাতে বৈশিষ্ট্যটি ব্যবহার করুন । যেমন

class GameClaim(models.Model):
    target = models.ForeignKey(User, related_name='gameclaim_targets')
    claimer = models.ForeignKey(User, related_name='gameclaim_users')
    isAccepted = models.BooleanField()

49
উত্তম উত্তর, তবে আমি মনে করি না যে আপনি অভদ্রতা এড়ানোর ক্ষেত্রে সফল হয়েছিলেন: পি "কেন" জ্যাঙ্গো অভ্যন্তরীণভাবে কীভাবে কাজ করে তা অবগত না হলে আপনি স্পষ্ট হন না।
কেনে

14
কারও জন্য কেবল কাঠামো শেখা, এটি সুস্পষ্ট হবে না be
jkyle

3
ধন্যবাদ, ত্রুটি বার্তাটি আমার কাছেও সুস্পষ্ট ছিল না, তবে বিপরীত সম্পর্ক সম্পর্কে আপনার ব্যাখ্যা খুব সহায়ক ছিল।
রুকে ২

1
শুধু কারণ সংঘর্ষ একটি ভাল ব্যান্ড ছিল, তাদের একটি বিশেষ বর্ণনামূলক ত্রুটি বার্তা দেখা যায় না;)
btown

7
এটিও উল্লেখ করা উচিত যে আপনার যদি সমস্ত মডেলের জন্য বিপরীত সম্পর্কগুলি ব্যবহার করার প্রয়োজন না হয়। কিছু ক্ষেত্রে আপনি মডেল সম্পর্কটি এক দিক হতে চাইতে পারেন। এই ক্ষেত্রে আপনি সম্পর্কিত_নাম = '+' ব্যবহার করেন। এটি জাজানোকে একমুখী সম্পর্ক তৈরি করতে এবং বিপরীত সম্পর্কটিকে উপেক্ষা করতে বলে।
টমি স্ট্র্যান্ড

8

Userমডেল জন্য এক একই নামের দুটি ক্ষেত্র তৈরি করার চেষ্টা করছে GameClaimsআছে যে Userযেমন target, এবং অন্য GameClaimsযে আছে Userযেমন claimer। এখানে দস্তাবেজগুলিrelated_name এখানে রয়েছে , যা জ্যাঙ্গোর পক্ষে আপনাকে গুনের নামগুলি সেট করার সুযোগ দেয় যাতে স্বয়ংক্রিয়ভাবে তৈরি হওয়াগুলি দ্বন্দ্ব না করে।


7

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

জ্যাঙ্গো ডক্স থেকে ...

যদি আপনি সম্পর্কিত_নাম গুণটি কোনও বিদেশীকি বা ম্যান্টিটোম্যানিফিল্ডে ব্যবহার করে থাকেন তবে আপনাকে অবশ্যই সর্বদা ক্ষেত্রের জন্য একটি অনন্য বিপরীত নাম নির্দিষ্ট করতে হবে। এটি সাধারণত অ্যাবস্ট্র্যাক্ট বেস ক্লাসগুলিতে সমস্যা সৃষ্টি করে, যেহেতু এই ক্লাসের ক্ষেত্রগুলি প্রতিটি শিশু ক্লাসে অন্তর্ভুক্ত করা হয়, প্রতিটি সময় অ্যাট্রিবিউটের জন্য একই মান (সম্পর্কিত_নাম সহ) অন্তর্ভুক্ত থাকে।

আরও তথ্য এখানে


2

কখনও কখনও আপনাকে অতিরিক্ত ফর্ম্যাটিং ব্যবহার করতে হবে related_name - বাস্তবে, উত্তরাধিকার ব্যবহৃত হওয়ার সময় যে কোনও সময়।

class Value(models.Model):
    value = models.DecimalField(decimal_places=2, max_digits=5)
    animal = models.ForeignKey(
        Animal, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class Height(Value):
    pass

class Weigth(Value):
    pass

class Length(Value):
    pass

এখানে কোনও সংঘাত নেই, তবে সম্পর্কিত_নাম একবার সংজ্ঞায়িত করা হয়েছে এবং জাজানো অনন্য সম্পর্কের নাম তৈরির জন্য যত্ন নেবে।

তারপরে মান শ্রেণীর বাচ্চাদের মধ্যে আপনার অ্যাক্সেস থাকবে:

herdboard_height_related
herdboard_lenght_related
herdboard_weight_related

0

আমি কখনই এই জাঙ্গো প্রকল্পের প্রয়োগ হিসাবে একটি উপ-মডেল যুক্ত করি, উদাহরণস্বরূপ নিম্নলিখিত কাঠামোটি দেওয়াতে আমি এগুলি দেখতে পাব বলে মনে হয়:

myapp/
myapp/module/
myapp/module/models.py

যদি আমি নিম্নলিখিতটি INSTALLED_APPS এ যুক্ত করি:

'myapp',
'myapp.module',

জ্যাঙ্গো মাইএপ.মাইমডিউল মডেল.পি ফাইলটি দু'বার প্রক্রিয়া করছে এবং উপরের ত্রুটিটি ছুঁড়েছে। এটি INSTALLED_APPS তালিকার মূল মডিউলটি অন্তর্ভুক্ত না করে সমাধান করা যেতে পারে:

'myapp.module',

সহ myappপরিবর্তে myapp.module, কারণ সব ডাটাবেস সারণি ভুল নামের সাথে তৈরি করা তাই এই মনে হয় এটা করার সঠিক উপায় হল যাবে।

আমি এই পোস্টটি পেরিয়ে এসেছি এই সমস্যার সমাধানের সন্ধান করতে গিয়ে আমি অনুভব করেছি যে আমি এটি এখানে রেখেছি :)


0

কেবল জর্ডানের উত্তরে যুক্ত করুন (টিপ জর্ডানের জন্য ধন্যবাদ) আপনি যদি অ্যাপ্লিকেশনগুলির উপরের স্তরটি আমদানি করেন এবং অ্যাপ্লিকেশনগুলি যেমন আমদানি করেন তবে এটিও ঘটতে পারে

myproject/ apps/ foo_app/ bar_app/

সুতরাং আপনি যদি অ্যাপস, foo_app এবং বার_অ্যাপ আমদানি করে থাকেন তবে আপনি এই সমস্যাটি পেতে পারেন। আমার কাছে অ্যাপ্লিকেশনগুলি ছিল, foo_app এবং বার_অ্যাপ সমস্ত সেটিংসে তালিকাভুক্ত IN INSTALLED_APPS

এবং আপনি যেভাবেই অ্যাপ্লিকেশনগুলি আমদানি করা এড়াতে চান, কারণ তারপরে আপনার কাছে একই অ্যাপ্লিকেশনটি 2 পৃথক নেমস্পেসে ইনস্টল করা আছে

apps.foo_app এবং foo_app

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