2009-02-25 8 views
16

Est-il possible de définir l'ordre de tri par défaut d'un modèle sur un champ à partir d'un modèle associé (plutôt que de la clé entière), c.-à-d. des deux modèles? Si c'est le cas, comment? Je peux le faire via query_by mais je n'arrive pas à comprendre comment le définir par défaut. Merci.Ordre de tri par défaut du modèle Django à l'aide du champ de table associé

class Foo(models.Model): 
    name = models.CharField(max_length=50) 

class Bar(models.Model): 
    related = models.ForeignKey(Foo) 
    bar_date = models.DateField() 

    class Meta: 
     ordering = ('bar_date', 'related.name',) 

Répondre

1

hmm ... Je suis en train de résoudre des problèmes similaires en upfactant l'ancienne application django, écrite avant qs-rf, où la notation "point" était probablement utilisée ??? ... il m'a fallu quelques heures pour diclose "quelque chose" et je ne suis pas encore sûr, mais ... essayez de remplacer le point par "__" (double underscore), cela peut aider, .. En fait, curently, je toujours HOPE TOO :-)))

@stuart: pour "order_with_respect_to", j'ai lu quelque chose sur le champ de modèle physique automatiquement ajouté dans la table des enfants ... Je ne comprends pas complètement comment les choses sont ici ... la documentation à mon humble avis est très mauvaise à propos de la syntaxe de commande, howgh!

aucun commentaire :-) http://code.djangoproject.com/ticket/8975

De toute façon, j'aime Django, mais ... :-))

2

Comme alternative à order_with_respect_to (qui ne supporte qu'un seul champ), vous pouvez utiliser un gestionnaire personnalisé pour fournir la commande. Cela vous permet également de commander sur plusieurs champs dans Foo et d'avoir toujours un gestionnaire Bar.objects normal. Vous devrez tester si l'ordre Meta ou l'ordre du gestionnaire personnalisé est appliqué en premier.

class FooSortedManager(models.Manager): 
    def get_query_set(self): 
     return super(FooSortedManager, self).get_query_set().order_by('foo__name') 

class Foo(models.Model): 
    name = models.CharField(max_length=50) 

class Bar(models.Model): 
    related = models.ForeignKey(Foo) 
    bar_date = models.DateField() 

    foo_sorted = FooSortedManager() 

    class Meta: 
     ordering = ('bar_date',) 
19

J'utilise django 1.2.7 et au lieu de se connecter ForeignKey.Attribute nous devrions utiliser "__", donc ce code fonctionne:

class Meta: 
    ordering = ('bar_date', 'related__name',) 
+0

+1 Nice et simple – tatlar

0

Dans la version moderne de django est:

class Meta: 
     ordering = ['word'] 
+0

Cette réponse est peu utile, car elle n'utilise pas le libellé réel de la question, donc on ne sait pas comment c'est différent dans les versions récentes. – mastachimp

0
class Question(models.Model): 

    question_text=models.CharField(max_length=200) 
     class Meta: 
    verbose_name_plural=" Question" 

class Choice(models.Model): 

    question=models.ForeignKey(Question,on_delete=models.CASCADE) 
    class Meta: 
    verbose_name_plural=" Choice" 

Soit vous pouvez modifier le nombre de places avant le nom de la classe comme ci-dessus ou le commander en utilisant les numéros ci-dessous:

class Question(models.Model): 

    question_text=models.CharField(max_length=200) 
     class Meta: 
    verbose_name_plural="1.Question" 

class Choice(models.Model): 

    question=models.ForeignKey(Question,on_delete=models.CASCADE) 
    class Meta: 
    verbose_name_plural="2.Choice" 
Questions connexes