2015-01-23 19 views
7

I mixin und Modell haben:Django GenericRelation in Modell Mixin

class Mixin(object): 
    field = GenericRelation('ModelWithGR') 

class MyModel(Mixin, models.Model): 
    ... 

Aber django schalte nicht GenericRelation Feld in GenericRelatedObjectManager:

>>> m = MyModel() 
>>> m.field 
<django.contrib.contenttypes.fields.GenericRelation> 

Wenn ich Feld in Modell setzen selbst oder abstraktes Modell - es funktioniert gut:

class MyModel(Mixin, models.Model): 
    field = GenericRelation('ModelWithGR') 

>>> m = MyModel() 
>>> m.field 
<django.contrib.contenttypes.fields.GenericRelatedObjectManager at 0x3bf47d0> 

Wie kann ich GenericRelation in mixin verwenden?

+0

Könnte so etwas helfen? http://timmyomahony.com/blog/reversing-unique-generic-foreign-key-django/ –

Antwort

5

Sie können immer von Model erben und es abstrakt machen, anstatt es von object erben. Pythons Mro wird alles herausfinden. Gefällt mir so:

class Mixin(models.Model): 
    field = GenericRelation('ModelWithGR') 

    class Meta: 
     abstract = True 

class MyModel(Mixin, models.Model): 
    ... 
+0

Ich weiß. In Frage habe ich geschrieben: "Wenn ich das Feld in das Modell selbst oder das __abstrakte Modell__ bringe, funktioniert es gut". Die Frage dreht sich nur um Mixin. – zymud

+1

Sie können Felder für reguläre Objekte nicht auf die gleiche Weise verwenden, wie sie für Modelle verwendet werden, insbesondere für verwandte Objekte. All dies, weil bei der Modellklassenerstellung eine spezielle Logik angewendet wird, die abhängig von einem Feldtyp mit Feldern verknüpft ist, die an sie gebunden sind: https://github.com/django/django/blob/master/django/db/ models/base.py # L60 Sie können versuchen, etwas herauszufinden, aber ohne einige seltsame Hacks wird es nicht möglich sein. Ich würde das nicht einmal empfehlen. –