Django ordem do modelo padrão de ordenação com campo de tabela relacionada

votos
18

É possível definir a ordem de classificação padrão para um modelo a um campo de um modelo relacionado (ao invés da chave inteiro) ou seja, algo que produz uma cláusula SQL ORDER BY com um campo de ambos os modelos? Se sim, como? Eu posso fazer isso via query_by mas eu não consigo descobrir como configurá-lo por padrão. Obrigado.

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', )
Publicado 25/02/2009 em 23:40
fonte usuário
Em outras línguas...                            


6 respostas

votos
21

I usar o Django 1.2.7 e em vez de conectar ForeignKey.Attribute devemos usar "__", de modo que este código irá funcionar:

class Meta:
    ordering = ('bar_date', 'related__name', )
Respondeu 21/09/2011 em 09:59
fonte usuário

votos
4

Dê uma olhada em fim-de-respeito-a .

Respondeu 26/02/2009 em 00:24
fonte usuário

votos
2

Como uma alternativa para order_with_respect_to (que suporta apenas um campo), você pode usar um gerenciador personalizado para fornecer a ordenação. Isso também permite que você pedir em vários campos em Foo e ainda ter um gerente Bar.objects normal. Você vai ter que testar para ver se o Meta.ordering ou a ordenação gerente personalizado é aplicado pela primeira vez.

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',)
Respondeu 17/04/2009 em 05:01
fonte usuário

votos
1

hmm ... estou resolvendo coisa semelhante enquanto upfactoring aplicação Django velho, escrito antes qs-rf, onde notação "dot" foi provavelmente usada ??? ... ele me levou algumas horas para diclose "algo" e eu ainda não tenho certeza, mas ... tentar substituir dot com "__" (sublinhados duplos), isso pode ajudar, .. Na verdade, curentlly, eu ainda TAMBÉM ESPERO :-)))

@stuart: para "order_with_respect_to", eu readed algo sobre campo de modelo físico automaticamente adicionado na tabela filho ... Eu não completelly entender como as coisas estão aqui ... documentação IMHO é muito ruim sobre a encomenda de sintaxe, howgh!

no comment :-) http://code.djangoproject.com/ticket/8975

de qualquer maneira, eu gosto de Django, mas ... :-))

Respondeu 30/03/2009 em 19:49
fonte usuário

votos
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"

Ou você pode alterar o número de espaços antes o nome da classe como acima ou encomendá-lo usando números como abaixo:

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"
Respondeu 10/08/2017 em 08:36
fonte usuário

votos
0

Na versão moderna do Django é:

class Meta:
        ordering = ['word']
Respondeu 30/12/2016 em 19:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more