2015-01-23 16 views
7

ho mixin e modello:Django GenericRelation nel modello Mixin

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

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

Ma Django non si trasformano GenericRelation campo in GenericRelatedObjectManager:

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

Quando ho messo campo nel modello stesso o il modello astratto - è funziona bene:

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

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

Come posso usare GenericRelation in mixin?

+0

Potrebbe qualcosa come questo aiutare? http://timmyomahony.com/blog/reversing-unique-generic-foreign-key-django/ –

risposta

5

È sempre possibile ereditare da Model e renderlo astratto anziché ereditarlo da object. Il mro di Python capirà tutto. Mi piace così:

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

    class Meta: 
     abstract = True 

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

Lo so. In questione ho scritto "Quando inserisco il campo nel modello stesso o __abstract model__ - funziona bene". La domanda riguarda solo mixin. – zymud

+1

Non è possibile utilizzare i campi su oggetti regolari nello stesso modo in cui sono utilizzati su Modelli, in particolare quelli correlati. Tutto perché c'è una logica speciale applicata alla creazione della classe del modello, che tratta i campi ad essa associati in modi speciali, a seconda del tipo di campo: https://github.com/django/django/blob/master/django/db/ models/base.py # L60 Puoi provare a capire qualcosa, ma senza alcuni strani hack non sarà possibile. Quindi non lo raccomanderei nemmeno di farlo. –