【问题标题】:order by condition Django按条件排序 Django
【发布时间】:2013-03-28 10:24:18
【问题描述】:

我有 3 个模型的用户资料和组:

class UserProfile(models.Model):    
    slug = models.SlugField(max_length=200)
    user = models.ForeignKey(User, unique =True)
    professionalNetwork = models.ForeignKey('SubForum',null=True, blank=True)

class Group(models.Model):
    slug = models.SlugField(max_length=200)
    name = models.CharField(max_length=200)
    professionalNetwork = models.ForeignKey('SubForum')

class SubForum(models.Model):
   name = models.CharField(max_length=200)

我如何获得所有组,首先是与特定用户具有相同专业网络的组,然后是其余组?

我正在研究 Group.objects.all().order_by('-professionalNetwork = profile.professionalNetwork') 之类的东西,但这当然行不通^^

谢谢你

【问题讨论】:

  • 你不是说过滤吗?
  • 过滤只会让我得到那些拥有相同专业网络的人。我希望它们都由具有相同专业网络的人首先订购。
  • 这实在是太本地化的要求了。 Django 支持按一个或多个字段的值排序。您想要的将需要自定义条件检查然后订购。您可以在获取查询集后进行排序,也可以编写原始 SQL。

标签: python sql django sql-order-by django-queryset


【解决方案1】:

这个怎么样(类似于docs 中的示例)。这个想法是你引入另一个字段来计算组是否属于指定的专业网络,然后查询集按该字段排序。

subforum_id = 1  # some id here by which you need to sort

sql = ''.join((
    'CASE professionalNetwork ',
    'WHEN {} THEN 1 '.format(subforum_id),
    'ELSE -1',
))
q = Group.objects.extra(select={'same_subforum': sql})
q = q.extra(order_by=['same_subforum'])

【讨论】:

    【解决方案2】:

    我明白了!

    groupRecommendation = Group.objects.extra(
    select={
        'network': """
        SELECT COUNT(*) FROM axiom_alto_userprofile
        WHERE \"professionalNetwork_id\"= axiom_alto_group.\"professionalNetwork_id\" AND axiom_alto_userprofile.id = %d """ % profile.id, 
    },
    ).order_by('-network')
    

    对于拥有相同专业网络的小组,这给我 1,对于没有的小组,给我 0^^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多