0

我的数据库中保存了多个对象,但我只想在我的查询集中显示唯一的项目,并且如果它们实际上保存了一个项目。

模型.py

class Everything(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    platform = models.CharField('Platform', max_length = 2000, null=True, blank=True)
    video = models.CharField('VideoID', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return u'%s %s %s %s' % (self.profile, self.playlist, self.platform, self.video)

视图.py

playlist2 = Everything.objects.filter(profile=request.user)

模板

<select name ="playlist2">
{% for item in playlist2 %}
  <option value="{{item.playlist}}">{{item.playlist}}</option>
{% endfor %}
</select>

不必有播放列表,因为 null=True 和 blank=True。播放列表中的某些项目也可能重复。如何仅显示其中具有值的不同项目?

4

2 回答 2

1

您可以使用excludedistinct查询集函数(文档)。

但是,在您的情况下,这并不是那么简单,因为您的CharField定义允许NULL( null=True) 和空字符串 ( blank=True) 值。所以这意味着你必须测试两个条件,并且你必须使用Qdocs)对象:

 everything = Everything.objects.exclude(Q(playlist=None) | Q(playlist='')).distinct()

这就是为什么 Django 文档不建议使用null=True字符串模型字段 ( docs ) 的原因。这是摘录:

除非您有充分的理由,否则请避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的;Django 约定是使用空字符串,而不是 NULL。

如果您遵循此转换,那么您的过滤器查找将变得更加简单:

 everything = Everything.objects.exclude(playlist=None).distinct()
于 2012-11-16T05:32:00.633 回答
0

您可以过滤掉所有空对象和空白对象。

playlist2 = Everything.objects.filter(playlist__isnull=False).exclude(playlist__exact='').distinct()

如 miki725 所述,我编辑了上述内容以包括处理空白。不过,可能不需要这些Q()功能。并不是说函数有什么问题Q(),我只是尽量避免使用可以增加可读性的函数。根据德摩根定理,NOT (playlist is null OR playlist is blank)等价于(NOT playlist is null) AND (NOT playlist is blank)。我更喜欢filterexcludeexclude对于空白是必要的,因为没有不相等的字段查找。您也可以exclude使用空播放列表,但您不能将排除项组合到一个调用中,除非您使用 Q 函数,否则您会得到NOT (playlist is null AND playlist is blank),这是不等价的。

于 2012-11-16T05:22:06.580 回答