0

データベースに複数のオブジェクトが保存されていますが、クエリセット内の一意のアイテムのみを表示し、実際にアイテムが保存されている場合にのみ表示したいと考えています。

models.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

excludeおよびdistinctqueryset 関数 ( docs )を使用できます。

ただし、定義で ( ) 値と空の文字列 ( )値CharFieldの両方が許可されているため、あなたの場合はそれほど単純ではありません。つまり、2 つの条件をテストする必要があり、そのために( docs ) オブジェクトを使用する必要があります。NULLnull=Trueblank=TrueQ

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

null=Trueこれがまさに、Django のドキュメントが文字列モデル フィールド ( docs )に使用することを推奨していない理由です。ここに抜粋があります:

特別な理由がない限り、CharField や TextField などの文字列ベースのフィールドで null を使用しないでください。文字列ベースのフィールドに null=True がある場合、それは「データなし」の 2 つの可能な値 (NULL と空の文字列) があることを意味します。ほとんどの場合、「データなし」に対して 2 つの可能な値を持つことは冗長です。Django の規則では、NULL ではなく空の文字列を使用します。

この変換に従うと、フィルター検索がはるかに簡単になります。

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

すべての null オブジェクトと空のオブジェクトを除外できます。

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

miki725 で指摘されているように、空白の処理を含めるように上記を編集しました。ただし、おそらくQ()関数の必要はありません。関数に問題があるわけではありませんがQ()、読みやすさが向上する可能性がある場合は避けようとしています。DeMorgan の定理により、NOT (playlist is null OR playlist is blank)は に相当し(NOT playlist is null) AND (NOT playlist is blank)ます。私は を好みますfilterexcludeexclude不等フィールド ルックアップがないため、空白には必要です。null プレイリストも同様excludeに使用できますが、Q 関数を使用しない限り、excludes を 1 つの呼び出しに結合することはできません。それ以外の場合はNOT (playlist is null AND playlist is blank)、同等ではありません。

于 2012-11-16T05:22:06.580 に答える