【问题标题】:Django query sort by all satisfying a condition and then all the othersDjango查询按所有满足条件然后所有其他条件排序
【发布时间】:2021-10-29 03:33:47
【问题描述】:

我有两个型号CityContact

class City(models.Model):
    name = models.CharField(max_length=40)
class Contact(models.Model):
    name_surname = models.CharField(max_length=60)
    preference = models.IntegerField(default=0, choices=PREFERENCE)
    city = models.ManyToManyField(City)

给定一个城市“A”,我正在尝试查询我的数据库以获取列表

  • 所有将“A”作为城市优先顺序的联系人
  • 然后所有没有“A”作为城市优先顺序的联系人

所以基本上如果我的联系人表(姓名、城市、偏好)有类似

  • 汤姆,纽约,2
  • 约翰,洛杉矶,5
  • 迈克,纽约,1
  • 理查德,SF,4

而我正在考虑的城市是纽约,查询将返回:

  • 迈克,纽约,1
  • 汤姆,纽约,2
  • 理查德,SF,4
  • 约翰,洛杉矶,5

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    这似乎有效:

    qs1 = Contact.objects.filter(city__name="NY")
    qs2 = Contact.objects.exclude(city__name="NY").order_by("city")
    
    qs1.union(qs2, all=True)
    

    您可能不需要all=True。我的测试需要它。

    Docs on union()

    【讨论】:

      【解决方案2】:

      试试这个:

      from django.db.models import Exists, OuterRef
      
      
      Contact.objects.annotate(
          has_ny=Exists(
              City.objects.filter(name='NY', contact=OuterRef('pk'))
          )
      ).order_by('-has_ny', 'preference')
      

      【讨论】:

      • 这个给我FieldError: Cannot resolve keyword 'contact_set' into field. Choices are: address, callsheet, contact, id, jobposition, jobproject, lat, long, name, owner, owner_id, statecontact_set=OuterRef('pk') 应该是/做什么?
      • 应该是城市联系人的相关名称。尝试使用contact
      • 仍然错误。如果我完全删除它,它仍然可以工作。该过滤器的作用是什么?
      • 检查联系人是否有任何城市名称为NY,并注解布尔标志。新的错误是什么?
      • 和之前一样,不识别关键字
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2017-07-10
      • 2011-11-10
      • 2016-12-04
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多