django:基于foregin密钥限制模型实例

时间:2016-02-03 14:11:24

标签: python django django-models django-admin

我有这样的模型

class Campaign(models.Model):
   campaign_name= models.CharField(max_length=30)
   user=models.ForeignKey(User)
   rows=models.IntegerField(default=3)
   columns=models.IntegerField(default=1)
   def __str__(self):                 # __unicode__ on Python 2
       return self.campaign_name+": "+self.campaign_desc

   def save(self, *args, **kwargs):
       print("Doing Custom Task ")
       super(Campaign, self).save(*args, **kwargs) # Call the "real" save() method.

class Item(models.Model):
   campaign=models.ForeignKey(Campaign)
   item_name=models.CharField(max_length=70)
   item_ID=models.CharField(max_length=400)
   def __str__(self):
       return self.item_name

我已使用admin.site.register(Campaign,CampaignAdmin)在管理员中注册了广告系列,并希望每个广告系列中的项目数为广告系列X列(外键)。

Q1)如果我在print("Doing Custom Task ")的位置使用保存覆盖方法对其进行验证,则在创建实例时我无法保存该实例。

Q2)将要填充的项目数量恰当地显示也很不错。现在我有了

class ItemInline(admin.TabularInline):
   model = Item
   #extra = 4
在admin.py中的

基本上我希望额外的参数是行X列

1 个答案:

答案 0 :(得分:1)

  1. 如果您想进行自定义验证,最好通过表单或(作为最后的手段)使用Model.clean*方法系列进行。

    class Campaign(models.Model):
        def clean(self):
            if self.pk:
                if self.item_set.count() > 5 # Or whatever number you need
                    raise ValidationError(_('Too much items for me.'))
    
  2. 覆盖内联的get_extra()方法:

    class ItemInline(admin.TabularInline):  
        extra = 4
        def get_extra(self, request, obj=None, **kwargs):           
            if obj:
                return obj.rows * obj.columns
            return self.extra