2011-02-05 2 views
1

私はDjango 1.2を使用しています。以下に示すように、私は、3つのフィールドでモデルを作成したいと思います:Django:モデル内の一意のフィールドの最大数を設定する

class Also_Viewed(models.Model): 
    page = models.ForeignKey(Page) 
    also_page = models.ForeignKey(Page) 
    rank = models.IntegerField() 
    class Meta: 
     unique_together = ('page', 'also_page') 

しかし、それぞれ独自のページフィールドのために、私は最大量(24を避ける)にテーブルの行数を制限したいです。テーブル内の最大24 occurancesため

したがって、たとえば、行の次のタイプは大丈夫だろう...

(Page_A, Page_x, 3) 
(Page_A, Page_y, 21) 
... 
(Page_A, Page_z, 45) 

...。


はどのようにDjangoのmodels.pyファイルでこの制約を設定することをお勧めしますか?

私が考えることができる唯一の方法は、別のフィールドを追加し、choiceオプションをわずか24のタプルの反復可能に設定することです。これはハックのように感じますが、実際には有効な解決策ですか?または、よりエレガントで効率的なソリューションについて考えてみませんか?


私はまた、そのページとalso_pageが異なるオブジェクトであることを確認したいと思います。しかし、私はこの方法に近づく方法を知らない。



それが本当に高く評価され、あなたの助けをありがとうございました!

答えて

2

独自のビューを使用している場合は、このコードを配置する場所としてモデル検証を使用できます。

これを管理者に強制する場合は、管理フォームを上書きする必要があります。 http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

# pseudocode. If you went the route of admin forms, 
# the ModelForms would use self.cleaned_data[attr] 

if self.page == self.also_page: 
    raise models(or forms).ValidationError("Pages are the same") 

elif Also_Viewed.objects.filter(page=self.page).count() >= 24: 
    raise models(or forms).ValidationError("Can not have more than 24 items for %s" % self.page) 

# let the unique_together catch uniqueness. 
+0

ありがとうございました。 –

関連する問題