2016-06-10 3 views
0

Ich habe die folgenden Modelle,Django, wie in einer viele zu viele Beziehung mit weniger Anfragen wählen

class TblMaterials(models.Model): 
name = ... 
.... 

class TblCategoris(models.Model): 
name = ... 
.... 

class TblMaterialCategories(models.Model): 
    tbl_categories = models.ForeignKey(TblCategories, blank=True, null=True) 
    tbl_materials = models.ForeignKey('TblMaterials', blank=True, null=True) 

und in meiner Homepage möchte ich in alle Materialien und der damit verbundenen Materialkategorie drucken. Offensichtlich könnte es einige Materialien ohne irgendwelche Kategorien geben.

meiner Meinung nach versuche ich so etwas wie:

TblMaterials.objects.all().select_related('tblmaterialcategories_set') 

und in Vorlagen:

{%for mat in materials%} 
    {{mat.name }} 

    {%for cat in mat.tblmaterialcategories_set.all %} 
     {{cat.tbl_categories.name}} , 
    {%endfor%} 

{%endfor%} 

Ich denke nicht, select_related Werke in diesem _SET Artikel. Ich möchte so etwas erreichen, ohne für jeden Artikel Fragen zu stellen. Wenn ich ein weiteres Feld zum Materialabfragesatz hinzufügen und auf es wie mat.categories und for loop zugreifen kann, wird es auch geschätzt.

Was könnte der beste Weg sein, alle Materialien und ihre Kategorien anzuzeigen?

Danke.

+0

Sie sollten 'prefetch_related', nicht' select_related' verwenden. –

Antwort

0

Wählen Sie verwandte können für die Fremdschlüssel verwendet werden, die im aktuellen Modell sind. Ein Beispiel:

Klasse TblMaterials (models.Model): name = ... .... Fremdschlüssel: TblMaterialCategories

Während das TblMaterial Modell aufrufen, wenn Sie mit ausgewählten Zusammenhang verwenden möchten tblMaterialCategories

TblMaterials.objects.all(). select_related ('tblmaterialcategories')

Es funktioniert.

Verwandte Themen