2010-06-17 3 views
0

J'ai des Pages avec des TextBlocks dessus. Les blocs de texte peuvent apparaître sur des pages différentes, les pages peuvent contenir plusieurs blocs de texte. Chaque page peut avoir ces blocs dans un ordre de son propre. Cela peut être résolu en utilisant un paramètre distinct à. Comme si:Django: Comment puis-je ajouter du poids/commander à une relation plusieurs à plusieurs?

class TextBlock(models.Model): 
    title = models.CharField(max_length=255) 
    text = models.TextField() 

class Page(models.Model): 
    textblocks = models.ManyToManyField(TextBlock, through=OrderedTextBlock) 

class OrderedTextBlock(models.Model): 
    text_block = models.ForeignKey(TextBlock) 
    product_page = models.ForeignKey(Page) 
    weight = models.IntegerField() 

    class Meta: 
     ordering = ('weight',) 

Mais je ne suis pas très enthousiaste sur les violations de DRY pour mon application. (Il y a beaucoup de relations ManyToMany ordonnées). Y a-t-il une façon recommandée de s'y prendre?

Edit: faute de frappe

Répondre

0

Vous pourriez peut-être créer votre propre Custom Field - OrderedManyToManyField, peut-être, comme subclass de ManyToManyField.

Ou, si cela ne ressemble pas idéal, vous pouvez utiliser votre approche existante, la création de multiples « à travers » modèles, mais subclass them de l'autre pour adhérer à DRY mieux que vous pouvez

class OrderedM2M(models.Model): 
    weight = models.IntegerField() 

    class Meta: 
     ordering = ('weight',) 
     abstract = True 

class OrderedTextBlock(OrderedM2M): 
    text_block = models.ForeignKey(TextBlock) 
    product_page = models.ForeignKey(Page) 
+0

Le champ personnalisé est une bonne idée qui m'a pointé dans cette direction: http://pypi.python.org/pypi/django-sortedm2m/0.2.0 –

Questions connexes