【问题标题】:how to get unique values in django如何在 django 中获取唯一值
【发布时间】:2019-12-12 21:05:34
【问题描述】:

我有一个类别模型和与这些类别相关的帖子列表,还有一些具有相同类别名称的帖子,但是当我想在模板中制作类别部分列表时, 它显示重复的类别名称,因为它与以下帖子相关:

食物, 食物, 沙漠, 风格, 沙漠, 但我想喜欢:

食物, 沙漠, 风格, 这是我的代码:

views.py

class ListCategory(ListView):
    model = Post
    paginate_by = 2
    template_name = 'shit.html'
    context_object_name = 'queryset'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        cate = Post.objects.all()
        context['cate'] = cate
        return context

models.py

class Category(models.Model):
    title = models.CharField(max_length=20)
    thumbnail = models.ImageField()
    detail = models.TextField()
    featured = models.BooleanField(default=True)
    def __str__(self):
        return self.title
    def get_absolute_url(self):
        return reverse('post-category', kwargs={
        'pk': self.pk
    })
class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    featured = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(Author,on_delete=models.CASCADE)
    thumbnail = models.ImageField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    tags = TaggableManager()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={
         'pk': self.pk
    })

模板

{% extends "base.html" %}
{% load static %}
{% block content %}
<div class="sidebar-box ftco-animate">
    <ul class="categories">
        <h3 class="heading mb-4">Categories</h3>
         {% for cat in cate %}
             <li><a href="{% url 'post-category' cat.category.pk %}">{{cat.category}}<span>(12)</span></a></li>
         {% endfor %}
    </ul>
</div>
{% endblock content %}

非常感谢!

【问题讨论】:

  • 那么您想根据类别分组您的Post 对象吗?
  • 我想在我的模板中列出唯一的类别部分..正如您所看到的,当我使用 for 循环获取所有类别但由于外键而显示重复名称时。但我想要类别的唯一名称如何拥有该功能
  • 那你为什么不遍历Category 来获取它们呢?如果您想根据类别显示Posts,请告诉我。
  • 是的,兄弟!我怎样才能做到这一点?是否可以通过 url 获得基于类别的特定帖子?正如我现在得到的那样

标签: python django django-models django-templates django-views


【解决方案1】:

您似乎想分组您的Posts,基于他们的category;所以你可以通过迭代Category(而不是Post)来实现这一点,并使用后向关系找出相关的Post对象。

views.py

class ListCategory(ListView):
    model = Category
    paginate_by = 2
    template_name = 'shit.html'  # :)
    context_object_name = 'queryset'

模板

{% extends "base.html" %}
{% load static %}
{% block content %}
<div class="sidebar-box ftco-animate">
    <ul class="categories">
        <h3 class="heading mb-4">Categories</h3>
         {% for category in queryset %}
             <li><a href="{% url 'post-category' category.pk %}">{{category}}<span>{{ category.posts_set.count }}</span></a></li>
             <ul>
                 {% for post in category.post_set.all %}
                     <li><a href="{% url 'post-detail' post.pk %}">{{ post }}</a></li>
                 {% endfor %}
             </ul>
         {% endfor %}
    </ul>
</div>
{% endblock content %}

我还使用{{ category.post_set.count }} 而不是12,因为我认为您正在寻找每个类别中Post 对象的数量。

【讨论】:

  • 非常感谢!非常感谢兄弟!几天以来,我一直坚持它..一切都很好......但它没有显示类别的数量 {{ category.posts_set.count }} 我能知道为什么吗?
  • 很高兴为您提供帮助。应该是{{ category.post_set.count }};只是一个额外的s :)
  • 酷哥!兄弟,如果你不介意的话,有什么办法可以让我在卡住的时候和你谈谈 :)
  • 您可以在我的个人资料中找到联系信息 (twitter)。
  • 兄弟你能解释一下你没有任何上下文 {% for post in category.post_set.all %} 但这件事是如何运作的,你的推特似乎不允许我敲你喜欢禁用文本:( ..我有话要和你分享:|
【解决方案2】:

您可以在所需字段中使用unique=True,以使每个值都唯一。如果您尝试添加具有相同 unique 字段值的新记录,则会引发 django.db.IntegrityError

More about unique

More about model's fields options

【讨论】:

  • 在类别模型中,类别名称是唯一的,但正如您在帖子模型中看到的外键允许单个类别可以有多个帖子,因此它显示重复名称但我不想看到相同的类别名称在类别部分多次
猜你喜欢
  • 2012-06-01
  • 2015-03-20
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2018-03-14
  • 2019-11-27
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多