7

単なる単語のリストである非常に単純なモデルがあるとします。

class WordList(models.Model):
    word = models.CharField(max_length=60)

ユーザーがフォームを送信した後、私はしたい...

  • 4 つのランダムな単語を取得する
  • それらを組み合わせて1つの文字列にします
  • 重複する文字列が以前に生成されていないことを確認し、生成されている場合はもう一度実行します
  • 良ければデータベースに保存する
  • 結果をユーザーに返します。

4 つのランダムな単語を取得する方法を知っています。

WordList.objects.order_by('?')[:4]

これをコンテキストにしてテンプレートに戻す方法を知っています。その時点で、それを使って何でもできますが、バックグラウンドでこれを行う方法に困惑しているので、戻す前に残りの作業を行うことができますユーザーに。最終的な文字列は次のようになります。

these-are-my-words

さらに、アプリのどこでこれを行うのですか? 私は PHP 出身で、functions.phpバックエンド処理を実行してプレゼンテーションから除外するためのファイルまたは何かを持っています。を使用していると述べている人々からの他のいくつかの投稿を見つけましたがfunctions.py、既存のviews.py. 私が行った場合:

from functions import myfunc

functions.pyインポート元のフォルダにある場合にのみ機能します。

4

4 に答える 4

18

クエリセットを文字列に変換するには、python の join 関数を使用します。

your_string = '-'.join([str(i) for i in WordList.objects.order_by('?')[:4]])

このコードは実際にはビューの 1 つに存在し、データベースには決して触れないようにすべきだと思いますが、アプリが何をしているかを知らずにそれを言うのは困難です。(確かに、この文字列をテンプレートに渡して、html ページにレンダリングしていますか?)

于 2013-02-24T18:30:25.640 に答える
0

これが最終的に機能したものです。秘訣は、Pythonリストと同じようにQuerySetにアクセスできることに気づかなかったことです。

dbQuery = WordList.objects.order_by('?')[:4]
result = dbQuery[0]
for word in dbQuery[1:]:
    result = "%s-%s" % (result, word)

それを行うにはもっと良い方法があるに違いないと思います。提案されたように、Joinは機能しませんでした。すべてのドキュメントで、文字列ではなくリストの結合に使用されていると記載されていても、文字列が必要であるというエラーが発生し続けたため、内訳がどこにあるかわかりません。

于 2013-02-25T04:43:36.543 に答える
0

投稿されたソリューションは「機能します」が、それは非常にPHPのやり方です。

より Django の方法:

アプリケーションの models.py ファイルで:

from django.db import models


class Word(models.Model):
    word = models.CharField(max_length=60, blank=False, null=False, unique=True)

    def __unicode__(self):
        return u'%s' % self.word


class RandomWordString(models.Model):
    string = models.CharField(max_length=255, blank=False, null=False, unique=True)

    def __unicode__(self):
        return u'%s' % self.string

    @staticmethod
    def generate(length):
        words = Word.objects.order_by('?')[:(length + 1)]
        possible_word_string = '-'.join(words.values_list('word', flat=True))
        try:
            RandomWordString.objects.get(string=possible_word_string)  # See if we've already generated this sequence
            return RandomWordString.generate(length)  # Call ourselves again if we have
        except RandomWordString.DoesNotExist:
            return possible_word_string  # If we haven't, return the value

    def save(self, *args, **kwargs):
        if not self.string or len(self.string) < 1:
            self.string = RandomWordString.generate(3)
        super(RandomWordString, self).save(*args, **kwargs)

次に、任意のビューまたは他の場所から:

from words.models import RandomWordString
seq = RandomWordString.generate(3)

save をオーバーライドしたため、次のこともできます。

from words.models import RandomWordString
string = RandomWordString.objects.create()
string.save()

これにより、すべてのロジックがモデル自体に配置されます。これは、ビュー内に配置するよりもわずかに優れています (ただし、完全に好みの問題です)。

私が投稿したものを超えて、 RandomWordString.generate にいくつかのロジックを追加して、無期限にループしないようにすることもできます。

于 2013-02-25T06:31:42.317 に答える