我在我的数据库中保存了多个对象,但我只想在我的查询集中显示唯一的项目以及实际上是否保存了项目。
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)
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且空白= True。播放列表中的某些项目也可能会重复。如何仅显示其中包含值的不同项目?
答案 0 :(得分:1)
您可以使用exclude
和distinct
查询集功能(docs)。
但是在您的情况下并非如此简单,因为您的CharField
定义同时允许NULL
(null=True
)和空字符串(blank=True
)值。这意味着你必须测试两个条件,为此你必须使用Q
(docs)个对象:
everything = Everything.objects.exclude(Q(playlist=None) | Q(playlist='')).distinct()
这正是Django文档不建议将null=True
用于字符串模型字段(docs)的原因。这是摘录:
避免在基于字符串的字段(如CharField和)上使用null TextField,除非你有一个很好的理由。如果是基于字符串的字段 has null = True,这意味着它有两个可能的“无数据”值: NULL和空字符串。在大多数情况下,拥有两个是多余的 “无数据”的可能值; Django约定是使用空的 字符串,而不是NULL。
如果您遵循此转换,那么您的过滤器查找会变得更加简单:
everything = Everything.objects.exclude(playlist=None).distinct()
答案 1 :(得分: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)
。我更喜欢filter
到exclude
,但空格需要exclude
,因为没有不相等的字段查找。您也可以exclude
空播放列表,但是您不能做的是将排除组合到一个调用中,除非您使用Q函数,否则您得到NOT (playlist is null AND playlist is blank)
,这不等同。< / p>