Django custom order_by

前端 未结 3 2026
余生分开走
余生分开走 2020-12-09 22:37

I\'ve got a model eg. Car with a foreign key eg. Owner, which may or may not be blank. The Car has a creation_date.

I would like to order these cars by date, but if

相关标签:
3条回答
  • 2020-12-09 23:08

    Have a look at this similar question: Good ways to sort a queryset? - Django

    You can't use the model's Meta ordering as it only accepts one field

    https://docs.djangoproject.com/en/dev/ref/models/options/#ordering

    You can't use the query order_by('creation_date', 'birthdate') as it only sorts by birthdate if they have the same creation_date

    So, you could write a custom manager to do incorporate a custom sort for you.

    import operator
    class CarManager(models.Manager):
        def get_query_set(self):
            auths = super(CarManager, self).get_query_set().all().order_by('-creation')
            ordered = sorted(auths, key=operator.attrgetter('birthday'))
            return ordered
    
    class Car(models.Model):
        sorted = CarManager()
    

    so now you can query:

    Car.sorted.all()
    

    to get all a queryset of sorted car's

    0 讨论(0)
  • 2020-12-09 23:13

    You could write a method that returns the appropriate date (if car has owner return birthday else return creation_date) and then order your model based on this method.

    0 讨论(0)
  • 2020-12-09 23:30

    This is possible by falling back to SQL:

    Car.objects.filter(...).extra(select={'odate': '''
      if(owner_id,
         (select date_of_birth from owner_table where id=owner_id),
         creation_date
      )
    '''}).order_by('odate')
    

    if function is MySQL-specific. In case of SQLite or Postgres you should use case statement.

    0 讨论(0)
提交回复
热议问题