2009-02-25 12 views
16

¿Es posible establecer el orden de clasificación predeterminado para un modelo de un modelo relacionado (en lugar de la clave entera), es decir, algo que produce una orden SQL por cláusula con un campo de ambos modelos? ¿Si es así, cómo? Puedo hacer esto a través de query_by pero no puedo encontrar la manera de configurarlo de manera predeterminada. Gracias.Orden de clasificación predeterminado del modelo Django utilizando el campo de tabla relacionado

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',) 

Respuesta

1

hmm ... Estoy solucionando algo similar mientras upfactoring aplicación django anterior, escrito antes de qs-rf, donde probablemente se utilizó la notación "punto" ??? ... me tomó algunas horas diclosear "algo" y todavía no estoy seguro, pero ... trate de reemplazar el punto con "__" (doble guión bajo), esto puede ayudar, .. De hecho, sin embargo, todavía HOPE TOO :-)))

@stuart: para "order_with_respect_to", leí algo sobre el campo de modelo físico agregado automáticamente en la tabla hija ... No entiendo completamente cómo están las cosas aquí ... La documentación de mi humilde opinión es muy mala sobre cómo ordenar la sintaxis, ¡cómo!

ningún comentario :-) http://code.djangoproject.com/ticket/8975

todos modos, me gusta Django, sin embargo ... :-))

2

Como alternativa a order_with_respect_to (que sólo es compatible con un campo), se puede utilizar una administrador personalizado para proporcionar el pedido. Esto también le permite ordenar en múltiples campos en Foo y aún tener un administrador de Bar.objects normal. Deberá probar para ver si primero se aplica el orden Metaordenador o el ordenamiento del administrador personalizado.

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

utilizo Django 1.2.7 y en lugar de conectar ForeignKey.Attribute debemos utilizar "__", por lo que este código funcionará:

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

+1 Agradable y simple – tatlar

0

En la versión moderna de Django es:

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

Esta respuesta no es útil, ya que no utiliza la redacción actual de la pregunta, por lo que no está claro cómo es diferente en las versiones recientes. – 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" 

Cualquiera puede alterar el número de espacios antes de que el nombre de la clase que el anterior o el orden que el uso de números de la siguiente manera:

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" 
Cuestiones relacionadas