সম্পর্কিত সমস্ত জ্যাঙ্গো মডেল অবজেক্ট পান


88

আমি কীভাবে সমস্ত মডেল অবজেক্টের একটি তালিকা পেতে পারি যেগুলিতে একটি বিদেশী কী কোনও বস্তুর দিকে ইঙ্গিত করে? (মুছে ফেলার ক্যাসকেডের আগে জ্যাঙ্গো অ্যাডমিনে মুছুন নিশ্চিতকরণ পৃষ্ঠাটির মতো কিছু)।

আমি ডাটাবেসে সদৃশ বস্তুগুলি মার্জ করার একটি সাধারণ উপায় নিয়ে আসার চেষ্টা করছি। মূলত আমি চাই যে ফরেনকিস পয়েন্টযুক্ত সমস্ত অবজেক্টগুলিকে "B" অবজেক্ট করার জন্য আপডেট করা উচিত যাতে আমি "বি" মুছে ফেলতে পারি তাই গুরুত্বপূর্ণ কিছু না হারিয়ে।

আপনার সাহায্যের জন্য ধন্যবাদ!


4
এই জ্যাঙ্গো স্নিপেট অবশ্যই পরীক্ষা করে দেখার মতো!
নিক মেরিল

আমি ঠিক একই জিনিসটি নিজে প্রয়োগ করার চেষ্টা করছি। আপনি কি নিজের সমাধানটি ভাগ করতে রাজি হবেন? স্পষ্টতই কীভাবে setসম্পর্কিত অবজেক্টটি এটিকে নির্দেশ করবে?
ইউজিন

উত্তর:


84

জ্যাঙ্গো <= 1.7

এটি আপনাকে সম্পর্কিত সম্পর্কিত সমস্ত জিনিসের নাম দেয়:

links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]

এরপরে আপনি সম্পর্কিত সমস্ত জিনিস পেতে এরকম কিছু ব্যবহার করতে পারেন:

for link in links:
    objects = getattr(a, link).all()
    for object in objects:
        # do something with related object instance

আমি এটি বের করার চেষ্টা করার জন্য কিছুটা সময় ব্যয় করেছি যাতে আমি আমার কোনও মডেলটিতে এক ধরণের "পর্যবেক্ষক প্যাটার্ন" প্রয়োগ করতে পারি। আশা করি এটি সহায়ক।

জ্যাঙ্গো 1.8+

ব্যবহার করুন _meta.get_fields(): https://docs.djangoproject.com/en/1.10/ref/models/meta/#django.db.models.options.Options.get_fields (উত্সেও বিপরীত দেখুন _get_fields())


7
all()অংশ উপর ব্যর্থ হবে OneToOneField। আপনাকে এটি কোনওভাবে সনাক্ত করতে হবে।
augustomen

4
এটি ম্যান্টি টোমনি সংযোগগুলি দেখায় না এবং হ্রাস করা হয়েছিল। জ্যাঙ্গো সালে 1.8+ এটা দিয়ে প্রতিস্থাপন করা সুপারিশ করা হচ্ছে _meta.get_fields(): docs.djangoproject.com/en/1.10/ref/models/meta/... (দেখুন reverse_get_fields()উৎস এছাড়াও)
int_ua

4
@Int_ua সম্পাদনা করার জন্য ধন্যবাদ! আমি অবাক হয়েছি যতক্ষণ না এটি জ্যাঙ্গোর সাথে সামঞ্জস্যপূর্ণ ছিল।
ছিনতাই

4
_meta.get_fields()টিপ অনুসরণ করে , এটি আমার জন্য সমাধানের অংশ ছিল: links = [field.get_accessor_name() for field in obj._meta.get_fields() if issubclass(type(field), ForeignObjectRel)](প্রদত্ত from django.db.models.fields.related import ForeignObjectRel)
ড্রিফ্যাচচার

21

@ ডিজিটালপিবিके খুব কাছে ছিল ... আপনি সম্ভবত যাজানগোর অন্তর্নির্মিত স্টাফ ব্যবহার করতে যাচ্ছেন তা মুছে ফেলার সময় সম্পর্কিত বিষয়গুলি প্রদর্শনের জন্য জাঙ্গো অ্যাডমিনে ব্যবহৃত হয়

from django.contrib.admin.utils import NestedObjects
collector = NestedObjects(using="default") #database name
collector.collect([objective]) #list of objects. single one won't do
print(collector.data)

এটি আপনাকে জাঙ্গো অ্যাডমিন প্রদর্শন করে এমন কি তৈরি করতে দেয় - সম্পর্কিত অবজেক্ট মুছে ফেলা হবে।


FWICT এটি পুরোপুরি সঠিকভাবে কাজ করে না। এটি এমন সম্পর্কের অনুসরণ করে দেখা যাচ্ছে যা মোছার মানদণ্ডকে বোঝায় না, যদিও আমি নিশ্চিত নই।
ক্যাটসকুল

4
এটি কি আমি, বা Collector(লাইন 1 এ আমদানি করা) ব্যবহৃত হয় না?
djvg

7

একবার চেষ্টা করে দেখুন

class A(models.Model):
    def get_foreign_fields(self):
      return [getattr(self, f.name) for f in self._meta.fields if type(f) == models.fields.related.ForeignKey]

খুব ManyToMany সম্পর্কে ভুলবেন না
theannouncer

6

নীচে ডিজেঙ্গো সম্পর্কিত সমস্ত অবজেক্টগুলি পেতে ব্যবহার করে

from django.db.models.deletion import Collector
collector = Collector(using="default")
collector.collect([a])

print collector.data

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

6

links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]

এরপরে আপনি সম্পর্কিত সমস্ত জিনিস পেতে এরকম কিছু ব্যবহার করতে পারেন:

for link in links:
    objects = getattr(a, link.name).all()
    for object in objects:
        # do something with related object instance

জ্যাঙ্গো থেকে 1.10 অফিশিয়াল ডক্স:

MyModel._meta.get_all_related_objects () হয়ে যায়:

[
    f for f in MyModel._meta.get_fields()
    if (f.one_to_many or f.one_to_one)
    and f.auto_created and not f.concrete
]

সুতরাং অনুমোদিত উদাহরণ গ্রহণ করে আমরা ব্যবহার করব:

links = [
            f for f in MyModel._meta.get_fields()
            if (f.one_to_many or f.one_to_one)
            and f.auto_created and not f.concrete
        ]

for link in links:
    objects = getattr(a, link.name).all()
    for object in objects:
        # do something with related object instance

আপনার উত্তরটি কিছুটা সংশোধন করার জন্য python for link in links: objects = getattr(a, link.name).all() for object in objects:
নাম এনগো

5
for link in links:
    objects = getattr(a, link).all()

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

objOrMgr = getattr(a, link)
 if objOrMgr.__class__.__name__ ==  'RelatedManager':
      objects = objOrMgr.all()
 else:
      objects = [ objOrMgr ]
 for object in objects:
      # Do Stuff

4

জাজানো 1.9
get_all_related_objects () অবমূল্যায়ন করা হয়েছে

#Example: 
user = User.objects.get(id=1)
print(user._meta.get_fields())

দ্রষ্টব্য: মুছে ফেলা আইডজ্যাঙ্গো১১০ সতর্কতা: 'get_all_related_objects একটি অবৈধ API যা অবমূল্যায়ন করা হয়েছে। আপনি এটি 'get_fields ()' দিয়ে প্রতিস্থাপন করতে সক্ষম হতে পারেন


get_fields সম্পর্কিত অবজেক্ট ফেরত দেয় না।
iankit

এটি জ্যাঙ্গো ১.৮ এও বিপরীত সংযোগগুলি ফেরত দেয়, ডকস.ডেজাঙ্গোপ্রজেক্ট /en/1.8/_modules/django/db/models/options/…
int_ua

2

সম্পর্কিত মডেলগুলিতে ক্ষেত্রগুলির তালিকা (কেবল নাম) পাওয়ার আরও একটি উপায় এখানে is

def get_related_model_fields(model):
    fields=[]
    related_models = model._meta.get_all_related_objects()
    for r in related_models:
        fields.extend(r.opts.get_all_field_names())
    return fields

2

দুর্ভাগ্যক্রমে, user._meta.get_fields () কেবল ব্যবহারকারীদের থেকে অ্যাক্সেসযোগ্য সম্পর্কগুলি ফেরত দেয়, তবে আপনার কিছু সম্পর্কিত অবজেক্ট থাকতে পারে, যা সম্পর্কিত_নাম = '+' ব্যবহার করে। এই জাতীয় ক্ষেত্রে, সম্পর্কটি user._meta.get_fields () দ্বারা ফিরে আসবে না। সুতরাং, অবজেক্টগুলিকে মার্জ করার জন্য আপনার যদি জেনেরিক এবং শক্তিশালী উপায়ের প্রয়োজন হয় তবে আমি উপরে বর্ণিত কালেক্টরটি ব্যবহার করার পরামর্শ দেব।

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