Django:在模型中设置最大数量的唯一字段

时间:2011-02-05 16:05:29

标签: python django django-models

我正在使用Django 1.2。我想制作一个包含3个字段的模型,如下所示:

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)。

例如,以下类型的行就可以了......

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

......表格中最多可出现24次。


您如何建议在Django models.py文件中设置此约束?

我能想到的唯一方法是添加另一个字段,并将choices选项设置为只有24个元组的可迭代。这感觉就像一个黑客,但它实际上是一个有效的解决方案?或者你能想到更优雅,更有效的解决方案吗?


我还想确保page和also_page是不同的对象。但是我不知道如何处理这个问题。



非常感谢你的帮助,非常感谢!

1 个答案:

答案 0 :(得分:2)

如果您正在使用自己的视图,则可以使用模型验证作为放置此代码的位置。 (但记住你必须自己打电话) http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

如果您希望在管理员中执行此操作,则需要覆盖管理表单。 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.