代码之家  ›  专栏  ›  技术社区  ›  Tudor

Django按第一个字母分组查询集?

  •  12
  • Tudor  · 技术社区  · 15 年前

    我有一个查询集,比如:

    items = Item.objects.all()
    

    项有一个“名称”字段。在我要显示的模板中:

    • 轴线
    • 火箭筒
    • C
    • 硬币
    • 弹药筒
    • S
    • 麻雀

    所以项目是按第一个字母排序和分组的。漏字母省略。有人有什么想法吗?

    6 回复  |  直到 7 年前
        1
  •  19
  •   Elf Sternberg    15 年前

    class Item(models.Model):
        ...
    
        def first_letter(self):
            return self.name and self.name[0] or ''
    

    {% regroup items by first_letter as letter_list %}
    <ul> 
    {% for letter in letter_list %}
      <li>{{ letter.grouper }}
        <ul>
            {% for item in letter.list %}
            <li>{{ item.name }}</li>
            {% endfor %}
        </ul>
      </li>
    {% endfor %}
    </ul>
    
        2
  •  6
  •   Ross    13 年前

    return self.name and self.name.upper()[0] or ''
    
        3
  •  5
  •   Ollie Cook    11 年前

    slice first_letter

    {% regroup items by name|slice:":1" as letter_list %}
    <ul> 
    {% for letter in letter_list %}
      <li>{{ letter.grouper }}
        <ul>
            {% for item in letter.list %}
            <li>{{ item.name }}</li>
            {% endfor %}
        </ul>
      </li>
    {% endfor %}
    </ul>
    
        4
  •  0
  •   user2633396    9 年前

    {% regroup items|dictsort:"name" by name.0 as item_letter %}
    <ul>
    {% for letter in item_letter %}
        <h4>{{ letter.grouper|title }}</h4>
        {% for i in letter.list|dictsort:"name" %}
            <li>{{ i.name }}</li>
        {% endfor %}
    {% empty %}
        <span>There is no items yet...</span>
    {% endfor %}
    </ul>
    

    name.0 item.name[0]

        5
  •  0
  •   Basil Jose    7 年前

    import string
    import collections
    
    from rest_framework.response import Response
    from rest_framework import status, viewsets
    
    def groupby(self, request):
        result = []
        for i in list(string.ascii_uppercase):
            c = City.objects.filter(name__startswith=i)
            if c:
                result.append((i, map((lambda x: x['name']),list(c.values('name')))
                ))
        return Response(collections.OrderedDict(sorted(dict(result).items())), status=status.HTTP_200_OK)
    

    class City(models.Model):
        """All features model"""
    
        name = models.CharField(max_length=99)
    

    {
        "A": [
            "Adelanto",
            "Azusa",
            "Alameda",
            "Albany",
            "Alhambra",
            "Anaheim"
        ],
        "B": [
            "Belmont",
            "Berkeley",
            "Beverly Hills",
            "Big Sur",
            "Burbank"
        ],
        ......
    
    }
    
        6
  •  0
  •   Javier Buzzi    7 年前

    import itertools
    
    collector = {}
    item_qs = Item.objects.all().order_by('name')
    for alphabet_letter, items in itertools.groupby(item_qs, lambda x: x.name[0].lower()):
        # you can do any modifications you need at this point
        # you can do another loop if you want or a dictionary comprehension
        collector[alphabet_letter] = items  
    

    collector yield