投稿されたソリューションは「機能します」が、それは非常に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 にいくつかのロジックを追加して、無期限にループしないようにすることもできます。