保存一個實例之前,我想阻止一個Django模型保存時一定約束條件沒有被滿足,給出一個驗證錯誤,這樣一個Django員工用戶知道什麼出錯。驗證計數()約束在Django
的約束是從count()
使用through
參數指定的中間表。
models.py:
class Goal(models.Model):
name = models.CharField(max_length=128)
class UserProfile(models.Model):
goals = models.ManyToManyField(Goal, through=UserProfileGoals, blank=True)
class UserProfileGoal(models.Model):
goal = models.ForeignKey(Goals)
user_profile = models.ForeignKey(UserProfile)
class UserGoalConstraint(models.Model):
user_profile = models.OneToOneField(UserProfile)
max_goals = models.PositiveIntegerField()
所以UserGoalConstraint.max_goals
給了我最大的可定義UserProfile.goal
其存儲在UserProfileGoal
型號數量(相同UserGoal
可以更經常地被存儲到UserProfile
)
clean()
,型號的
clean()
和
pre_save
信號前夕
我已閱讀並試圖解決方案NTS,
但實際的問題我已經是,我怎麼知道,如果它只是一個更新或新的數據庫條目,因爲
class UserProfileGoal(models.Model):
goal = models.ForeignKey(Goals)
user_profile = models.ForeignKey(UserProfile)
def clean(self):
goal_counter = self.user_profile.goals.count() + 1
try:
qs = UserGoalConstraint.objects.get(user_profile=self.user_profile)
except UserGoalConstraint.DoesNotExist:
raise ObjectDoesNotExist('Goal Constraint does not exist')
if goal_counter > qs.max_goals:
raise ValidationError('There are more goals than allowed goals')
並未真正發揮作用,爲clean()
也可以是一個更新+1會給我一個導致ValidationError的錯誤結果。
我的客戶應該使用Django的管理界面通過一個內嵌直接添加到目標用戶配置文件:
admin.py:
class UserProfileGoalInline(admin.TabularInline):
model=UserProfileGoal
class UserProfileAdmin(admin.ModelAdmin)
...
inlines = [UserProfileGoalInline, ]
所以他需要很好地被告知,當他將許多目標添加到用戶配置文件中。
也許我失去了一些東西就如何解決這個問題很明顯...? 我正在尋找一個工作,並以某種方式用戶友好的解決方案(=在管理界面得到通知)。
[更新]: 我想知道請檢查是否在的clean()
if self.pk is not None:
return # it is not a create
...
開始創建或不與self.pk is None
招它,我認爲這將解決這個問題... 然而,在管理員內聯中,當員工用戶同時添加多個目標時,clean()不會識別這些目標。調試輸出顯示加2個的目標,我們的目標計數器保持相同數量甚至第二個條目應該有一個,而應給出一個驗證錯誤
我試過你對我的真實例子的建議。但是我已經在「GoalForm」類中掙扎了。 '目標'可以在沒有'UserProfile'的情況下創建。我想你的意思是'UserProfileGoal'?此方法也不起作用,請參閱問題中的UPDATE部分。然而'ModelForm'爲我提供瞭解決方案,我將作爲答案發布。 – Dowi