我正在使用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是不同的对象。但是我不知道如何处理这个问题。
非常感谢你的帮助,非常感谢!
答案 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.