2013-10-22 8 views
11

मैं अपने डीजेंगो एप्लिकेशन को किसी भी मॉडल के फ़ील्ड की सूची देने के लिए चाहूंगा (इससे जीयूआई स्वयं को बनाने में मदद मिलेगी)।Django: मॉडल के सभी रिवर्स रिश्तों को सूचीबद्ध करें

कल्पना कीजिए वर्गों (तथ्य की अनदेखी कि Steps के सभी क्षेत्र Item में हो सकता है, मैं अपने कारणों :-))

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField() 

class Steps(models.Model): 
    item = models.OneToOneField('Item', related_name='steps') 
    design = models.BooleanField(default=False) 
    prototype = models.BooleanField(default=False) 
    production = models.BooleanField(default=False) 

अब, जब मैं एक मॉडल के क्षेत्रों की सूची बनाना चाहते:

def get_fields(model): 
    return model._meta.fields + model._meta.many_to_many 

लेकिन मैं अपने मॉडलों के लिए "संबंधित" एक-से-एक विदेशी कुंजी की सूची भी प्राप्त करना चाहता हूं। मेरे मामले में Item.steps उस सूची में नहीं होगा।

मुझे पता चला है कि model._meta.get_all_field_names में सभी संबंधित फ़ील्ड शामिल हैं।

लेकिन जब मैं Item._meta.get_field_by_name('steps') फोन यह एक टपल एक RelatedObject, जो मुझे तुरंत नहीं बताता है कि यह एक एकल संबंध है या एक एक-से-कई (मैं सूची में केवल एक-से-एक उलट चाहते पकड़े रिटर्न रिश्ते)।

इसके अलावा, मैं कोड के इस बिट का उपयोग कर सकते हैं:

from django.db.models.fields.related import SingleRelatedObjectDescriptor 
reversed_f_keys = [attr for attr in Item.__dict__.values() \ 
        if isinstance(attr, SingleRelatedObjectDescriptor)] 

लेकिन मैं इस बात से बहुत संतुष्ट नहीं हूँ।

कोई भी मदद, विचार, टिप्स का स्वागत है!

चीयर्स

+0

तो हाँ, मेरे पास मेरी ज़रूरत के लिए एक संभावित समाधान है, लेकिन मुझे बेहतर होने की खुशी होगी :) –

उत्तर

0

और क्या इस बारे में:

oneToOneFieldNames = [ 
    field_name 
    for field_name in Item._meta.get_all_field_names() 
    if isinstance(
     getattr(
      Item._meta.get_field_by_name(field_name)[0], 
      'field', 
      None 
     ), 
     models.OneToOneField 
    ) 
] 

RelatedObject संबंधों के लिए एक फील्ड विशेषता हो सकती है। आपको सिर्फ यह जांचना है कि यह एक OneToOne फ़ील्ड है और आप केवल वही प्राप्त कर सकते हैं जो आप चाहते हैं

3

मुझे पता चला है कि Model._meta के तरीके हैं जो मुझे जो चाहिए वो दे सकते हैं।

my_model = get_model('app_name','model_name') 
# Reverse foreign key relations 
reverse_fks = my_model._meta.get_all_related_objects() 
# Reverse M2M relations 
reverse_m2ms = my_model._meta.get_all_related_many_to_many_objects() 

संबंधों की सामग्री पार्स करके, मुझे लगता है कि कर सकते हैं कि "प्रत्यक्ष" क्षेत्र एक OneToOneField या जो कुछ भी किया गया था।

5

यह बदला गया था (1.8 मुझे लगता है) और ओलिवियर का जवाब अब और काम नहीं करता है। docs के अनुसार, नया तरीका

[f for f in User._meta.get_fields() 
    if f.auto_created and not f.concrete] 

इसमें शामिल है एक-से-एक, कई-से-एक, और कई-से-अनेक।

+0

बहिष्कार पर सिर के लिए धन्यवाद। जब मैं 1.10 पर अपग्रेड करता हूं तो यह मुझे सिरदर्द बचाएगा :) (हालांकि अब 1.6 के साथ अटक गया है) –

+0

ईश्वर मुझे विश्वास नहीं है कि मैंने पहले कभी इस बारे में सोचा नहीं है, इसलिए यदि यह स्वतः_क्रेटेड है और ठोस नहीं है तो यह हमेशा होगा एक रिवर्स रिश्ते? – Mojimi

+0

इस समाधान में एक समस्या है, यह कई लोगों के रिश्ते को भी सूचीबद्ध करता है जिनमें एक थ्रूटेबल है, मुझे उन्हें फ़िल्टर करने का एक तरीका मिला लेकिन यह बहुत कठिन है – Mojimi

संबंधित मुद्दे