【问题标题】:How to return all the distinct foreign keys in a Django view?如何在 Django 视图中返回所有不同的外键?
【发布时间】:2021-09-29 16:27:59
【问题描述】:

这是我的model.py:

class Category(models.Model):
    name = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=255, default='')

    def __str__(self):
        return "%s" % (self.name)


class SubCategory(models.Model):
    name = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=255, default='')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name']

还有我的 view.py:

def home(request):
    context = {
        'home_page': "active",
        'categories': SubCategory.objects.order_by('category').distinct('category').values_list('category'),
    }
    return render(request, 'candidates/home.html', context)

还有我的模板:

<ul>
        {% for category in categories %}
            <li>{{ category }}</li>
        {% endfor %}
    </ul>

我看到的不是类别名称,而是他们的 ID

我怎样才能知道他们的名字?

谢谢

【问题讨论】:

    标签: django foreign-keys django-queryset


    【解决方案1】:

    你应该使用类别的名称,所以:

    def home(request):
        context = {
            'home_page': "active",
            'categories': SubCategory.objects.order_by('category__name').distinct('category__name').values_list('category__name', flat=True),
        }
        return render(request, 'candidates/home.html', context)

    话虽如此,查询Subcategory 并没有多大意义。您可以通过以下方式获取Categorys 的列表:

    def home(request):
        context = {
            'home_page': "active",
            'categories': Category.objects.order_by('name'),
        }
        return render(request, 'candidates/home.html', context)

    或者,如果您只希望 Categorys 至少有一个子类别,您可以使用:

    def home(request):
        context = {
            'home_page': "active",
            'categories': Category.objects.filter(subcategory__isnull=False).order_by('name').distinct(),
        }
        return render(request, 'candidates/home.html', context)

    您可以将Category__str__ 简化为:

    class Category(models.Model):
        name = models.CharField(max_length=50, unique=True)
        description = models.CharField(max_length=255, default='')
    
        def __str__(self):
            return f'{self.name}'

    编辑:您可以按子类别的数量(按降序)对Categorys 进行排序:

    def home(request):
        context = {
            'home_page': "active",
            'categories': Category.objects.annotate(
                nsub=Count('subcategory')
            ).order_by('-nsub')
        }
        return render(request, 'candidates/home.html', context)

    【讨论】:

    • 只是一件小事,如果我想按“子类别计数”对类别进行排序怎么办?
    • @VincentRoye:请参阅答案底部的编辑。
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多