如何 return Django 视图中所有不同的外键?

How to return all the distinct foreign keys in a Django view?

这是我的 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

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

谢谢

您应该使用类别的名称,因此:

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

也就是说,查询 Subcategory 没有多大意义。您可以通过以下方式获得 Category 的列表:

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

或者,如果您只想要 Category 至少有一个子类别,您可以使用:

def home(request):
    context = {
        'home_page': "active",
        'categories': <b>Category.objects.filter(subcategory__isnull=False).order_by('name').distinct()</b>,
    }
    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 <strong>f'{self.name}'</strong>

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

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