我希望外键的每个实例都有不同的默认值,具体取决于它在父模型中的属性。
一个插图可能会更清楚地说明这一点:
class Day(models.Model):
date = models.DateField(unique=True)
manager_shift = models.ForeignKey('Shift') # Shift.shift_type should be "M"
lead_shift = models.ForeignKey('Shift') # Shift.shift_type should be "L"
early_day_shift = models.ForeignKey('Shift') # Shift.shift_type should be "ED"
late_day_shift = models.ForeignKey('Shift') # Shift.shift_type should be "LD"
swing_shift = models.ForeignKey('Shift') # Shift.shift_type should be "SW"
early_evening_shift = models.ForeignKey('Shift') # Shift.shift_type should be "EM"
late_evening_shift = models.ForeignKey('Shift') # Shift.shift_type should be "LM"
class Shift(models.Model):
user = models.ForeignKey('User', limit_choices_to={'is_staff': True}, blank=False)
shift_type = models.CharField(max_length=2, choices=SHIFT_TYPE_CHOICES, blank=False)
SHIFT_TYPE_CHOICES = {
('M', 'Manager'),
('L', 'Lead'),
('ED', 'Early Day'),
('LD', 'Early Day'),
('SW', 'Swing'),
('EM', 'Early Evening'),
('LM', 'Late Evening'),
}
在这种情况下,
所以在做的时候:
Day.manager_shift = Shift()
Day.manager_shift.shift_type 应该自动为 "M">
您可以将默认值设置为可调用值,因此您可以执行以下操作:
def get_m_shift():
return Shift.objects.get(shitf_type='M')
class Day(models.Model):
date = models.DateField(unique=True)
manager_shift = models.ForeignKey('Shift', default=get_m_shift)
我认为您必须编写函数才能获得每种班次类型。我不确定默认的可调用对象 take 参数。
我不相信有任何内置的方式可以做到这一点,也不应该有。如果你这样做会发生什么:
>>> my_shift = Shift()
>>> Day.manager_shift = my_shift
>>> Day.lead_shift = my_shift
>>> my_shift.shift_type
???
更好的选择是覆盖save
方法Day
以检查保存对象的每个字段,并且:a(如果没有shift_type
,请添加正确的字段;b( 如果有轮班时间,但错误,请引发错误(不是最干净的解决方案,但我不知道有什么更好的(。
更新:我刚刚读到(编辑:Rohan还指出(你可以给ForeignKey
一个默认值,但你应该以函数的形式这样做:
def default_type(type):
temp = [type] # Necessary because Python can't handle closures properly sometimes
def closure():
return Shift.objects.get(shift_type=temp[0])
return closure
class Day(models.Model):
date = models.DateField(unique=True)
manager_shift = models.ForeignKey('Shift', default=default_type('M'))
为什么你有一个单独的"日"模型?
SHIFT_TYPE_CHOICES = {
('M', 'Manager'),
('L', 'Lead'),
('ED', 'Early Day'),
('LD', 'Early Day'),
('SW', 'Swing'),
('EM', 'Early Evening'),
('LM', 'Late Evening'),
}
class Shift(models.Model):
user = models.ForeignKey('User',
limit_choices_to={'is_staff': True},
blank=False)
shift_type = models.CharField(max_length=2,
choices=SHIFT_TYPE_CHOICES,
blank=False)
shift_date = models.DateField()
class Meta:
unique_together = (('shift_date','shift_user','shift_type'),)
这将防止同一用户在同一日期出现重复班次,并且只能防止排班类型和用户的一种组合。 您可以根据需要进行调整。因此,如果您需要在同一日期进行多个班次,请删除shift_date
.unique_together
的文档解释了它是如何工作的。
现在,要找出谁是特定日期的经理:
for s in Shift.objects.filter(shift_type='M',
shift_date=datetime.datetime.today()):
print s.user
或者打印整个花名册的天数:
for s in Shift.objects.filter(shift_date=datetime.datetime.today()):
print "%s: %sn" % (s.get_shift_type_display(),s.user)