django:根据列匹配的数量对行进行排序

时间:2017-04-17 07:29:29

标签: django django-orm

我有一个模特: -

class Userprofile(models.Model):
    user=models.OneToOneField(settings.AUTH_USER_MODEL)
    education=models.models.CharField(max_length=20,blank=True,null=True)
    country=models.CharField(max_length=20,blank=True,null=True)
    occupation=models.CharField(max_length=20,blank=True,null=True)     ....

用户个人资料(让我们说:('主人','印度','学生')我想按照与给定用户资料匹配的字段数过滤所有用户资料,即首先是所有3个字段匹配配置文件然后匹配配置文件的任何2个字段等等。任何人都可以建议一种有效地做到这一点的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用conditional expressions实现此目的。

from django.db.models import Value, Case, When, IntegerField, F

education, country, occupation = 'masters','India','student'
Userprofile.objects.annotate(education_matched=Case(
    When(education=education, then=Value(1)), 
    default=Value(0), 
    output_field=IntegerField()
), country_matched=Case(
    When(country=country, then=Value(1)), 
    default=Value(0), 
    output_field=IntegerField()
), occupation_matched=Case(
    When(occupation=occupation, then=Value(1)), 
    default=Value(0), 
    output_field=IntegerField()
)).
annotate(matched=F('education_matched') + F('country_matched') + F('occupation_matched')).
order_by('matched')