2

Ich versuche, Daten BillRecord von Django admin.I zu einer Tabelle hinzufügen müssen ausgewählte Werte von in Modell ManyToMany Feld zuzugreifen Methode speichern und müssen Führen Sie eine Logik aus, die von den ausgewählten Objekten des Felds ManytoMany abhängt.Get Werte von ManyToMany Feld in django Modell Speichermethode ausgewählt

class ProductType(BaseApplicationModel): 
    name = models.CharField(max_length=128) 

class Product(BaseApplicationModel) 
    type = models.ForeignKey(ProductType,related_name="products") 

class BillRecord(BaseApplicationModel): 
    products = models.ManyToManyField(Product, related_name="billrecords") 

    def save(self, *args, **kwargs): 
     super(BillRecord, self).save(*args, **kwargs) 
     for product in self.products.all(): 
      print product 

In dem Code, wenn ich die Werte von Produkt zu drucken versucht, es mir billing.Product.None gibt, die self.products.all() kehrt leer queryset

ich die IDs der ausgewählten Objekte im ManyToMany Feld Auswahlfeld bekommen müssen, ist. picture

Antwort

0

Das Problem ist, dass Ihre BillRecord Instanz nicht immer gespeichert ist, wenn ein Product mit ihm verbunden ist. Bei einer Beziehung "Viele zu Viele" können Sie beide Objekte zuerst speichern. Der richtige Weg, damit umzugehen ist die m2m-changed signal zu verwenden:

from django.db.models.signals import m2m_changed 

...your models here... 

def products_changed(sender, **kwargs): 
    # Do something here 
    pass 

m2m_changed.connect(products_changed, sender=BillRecord.products.through) 
+0

Nach dem Hinzufügen, was Sie erwähnt Ich erhalte 'Attribute:

Sent when a ManyToManyField is changed on a model instance. Strictly speaking, this is not a model signal since it is sent by the ManyToManyField, but since it complements the pre_save/post_save and pre_delete/post_delete when it comes to tracking changes to models, it is included here.

So sollten Sie etwas wie das folgende versuchen Typ Objekt ' BillRecord_products 'hat kein Attribut' product_set'' – albinantony143

+0

@ albinantony143 Sorry, ich hatte es nicht getestet, da es als Beispiel angegeben wurde. In diesem Fall können Sie auf das Schlüsselwort "instance" zugreifen (mit 'kwargs.pop (" instance ")') und es als Ihre 'BillRecord'-Instanz verwenden. – Selcuk

+0

'kwargs.pop (" instance ")' gibt mir eine Instanz von 'BillRecord'. Und als ich versuchte, "kwargs.pop (" instance ") zu drucken, gab es immer noch" billing.Product.None ". Gibt es einen Weg durch, ich kann die IDs von ManyToMany Feldobjekte erhalten. – albinantony143

Verwandte Themen