1

我希望 ForeignKey 的每个实例都有不同的默认值,具体取决于它在父模型中的属性。

一个插图可能会更清楚地说明这一点:

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”

4

3 回答 3

1

我不相信有任何内置的方法可以做到这一点,也不应该有。如果你这样做会发生什么:

>>> my_shift = Shift()
>>> Day.manager_shift = my_shift
>>> Day.lead_shift = my_shift
>>> my_shift.shift_type
???

更好的选择是覆盖检查保存对象的每个字段的save方法,Day并且:a)如果没有shift_type,则添加正确的;b)如果有一个轮班时间,但是一个错误的,提出一个错误(不是最干净的解决方案,但我不知道有什么更好的方法)。

更新:我刚刚读到编辑:和 Rohan 也指出)你可以给 a 默认值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'))
于 2012-07-11T05:10:02.850 回答
1

您可以将默认值设为可调用,因此您可以这样做:

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)

我认为您必须编写函数来获取每种班次类型。我不确定默认的可调用参数。

于 2012-07-11T05:12:58.823 回答
1

为什么你有一个单独的“Day”模型?

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: %s\n" % (s.get_shift_type_display(),s.user)
于 2012-07-11T05:27:09.670 回答