2009-06-25 8 views
0

Ich schreibe eine Datenmigration mit South ... aber die Frage bezieht sich auf die Verwendung von select_related, um viele zu erhalten Viele felder.select_related über viele bis viele Felder in Django oder wie bekomme ich Zugriff auf viele bis viele Felder mit .all()

Die Dokumentation legt fest, dass select_related für Felder mit Beziehungen mit ForeignKey verwendet werden kann ... ich kann nicht ergründen, wird nicht mit ManyToMany Felder richtig arbeiten?

Mein Feld habe leer = null, aber die Dokumentation sagt, dass Sie select_related ('field_name') noch aufrufen können und es wird die relevanten Beziehungen ziehen. aber wenn ich versuche, das unten zu tun ...

wo Auflistung ist ein Element in einem queryset

for listing in RealEstateListing.objects.all(): 
     listing_type_slug_url = slugify(listing.listing_type.name) 
     sub_type = orm.SubType.objects.get(slug_url=listing_type_slug_url) 
     pricing_option = PricingOption.objects.get(name=listing.pricing_option.name) 
     lt = orm.Listing(listing_type=sub_type.parent, 
         sub_type=sub_type, 
         expiration_date=listing.expiration_date, 
         title=listing.title, 
         slug_url = listing.slug_url, 
         description = listing.description, 
         contact_person=listing.contact_person, 
         secondary_contact=listing.secondary_contact, 
         address=listing.address, 
         location=listing.location, 
         price=listing.price, 
         pricing_option=pricing_option, 
         display_picture=listing.display_picture, 
         image_gallery=listing.image_gallery, 
         date_added=listing.date_added, 
         status=listing.status, 
         featured_on_homepage=listing.featured_on_homepage, 
         ) 
     lt.save()  

     lt.features.clear() 
     if listing.property_features: 
      property_features = listing.property_features.all() 
     else: 
      property_features = None 
     if property_features:  
      for ft in property_features: 
       ft_ = Feature.objects.get(name=ft.name) 
       lt.features.add(ft_) 

Ich erhalte einen Fehler mir zu sagen, dass es nicht das Feld property_features lösen kann ... die verfügbaren Felder sind nur ID & Name ... es scheint nicht die Beziehungen zu ziehen.

meine andere Frage ist, wenn wir select_related nicht verwenden können, um auf viele bis viele Felder zuzugreifen, was ist die Alternative?

---------------------------------------------- --EDIT ----------------------------------------

ich entfernte die Verweis auf Süd-Fake-Orm, die ich verwendet habe, um die Datenmigration zu tun.

, was ich im Grunde mit den obigen Code zu tun nimmt alle RealEstateListings Objekte dann in einer for-Schleife einen neuen Eintrag Objekt mit den Daten aus den alten RealEstateListings Schaffung

der letzte Teil ist, wo ich das Problem haben und gibt mir den Fehler oben mit dem viele bis viele Feld property_features aus dem alten RealEstateListing Modell

Antwort

2

Es ist ziemlich unmöglich, Ihren Code zu debuggen, wie es scheint, in einer Methode zu versagen, die Sie verwenden. Meine Vermutung ist, dass Sie objects.filter (property_features = ...) tun, in der Hoffnung, property_features durch einen Wert zu ersetzen. Sie können das nicht tun, da es als Schlüsselwortargument geschrieben wurde.

Es scheint auch wie Sie die Verwendung von select_related missverstanden haben. Es wird nur verwendet, um zusätzliche Abfragen zu vermeiden, die auf verwandte Objekte zugreifen. Ich bin nicht sicher über M2M-Felder, aber sie sind nicht das gleiche wie FK, also erwarte nicht, dass sie gleich reagieren.

Edit:

So haben RealEstateListing ein M2M genannt property_features

Zunächst einmal diese if-Anweisung ist nicht gut:

if listing.property_features: 
    property_features = listing.property_features.all() 
else: 
    property_features = None 
if property_features: 

Da alle RealEstateListing eine M2M hat, wird dies immer der Fall sein, wie henden .property_features würde ein django.db.models.fields.related.ManyRelatedManager-Objekt zurückgeben, das als True ausgewertet wird. Wenn in der Auflistung kein M2M-Feld vorhanden wäre, würden Sie stattdessen einen AttributeError erhalten. Dies ist nicht der Fehler, den Sie bekommen, aber, aber Sie sollten mit Ihrem obigen Code ändern:

property_features = listing.property_features.all() 
if property_features: 
da dies das gleiche tun, wenn es keine property_features sind, auf das Objekt der property_features Variable wird eine leere Liste sein .

Jetzt zum eigentlichen Fehler. Wieder muss ich sagen, dass nichts, was Sie hier geschrieben haben, diesen Fehler erzeugen kann. Wie, bevor Sie einen solchen Fehler bekommen würde, wenn haben Sie so etwas wie

Listing.objects.filter(property_features=x) 

die vollständige Veröffentlichung Tradeback würde helfen, festzustellen, wo Probleme auftreten.

+0

hi, siehe meine Bearbeitung oben, entfernte ich Verweis auf Süd gefälschte orm. Objekt – Rasiel

+0

danke das hat mich auch ratlos, da nichts scheint falsch zu sein und nein, ich mache nicht Ihre letzten Codes Probe. Ich werde den Traceback später veröffentlichen. – Rasiel

Verwandte Themen