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メソッドをオーバーライドすることです。a) がない場合は、正しいものを追加します。b) シフト時間があるが間違っている場合は、エラーを発生させます (最もクリーンな解決策ではありませんが、それ以上の解決策は知りません)。Dayshift_type

更新:にデフォルト値を与えることができることを読んだところです(編集:そして 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'))
于 2012-07-11T05:10:02.850 に答える
1

別の「日」モデルがあるのはなぜですか?

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'),)

これにより、同じ日付に同じユーザーのシフトが重複することがなくなり、シフト タイプとユーザーの組み合わせが 1 つだけになります。必要に応じて調整できます。したがって、同じ日に複数のシフトが必要な場合は、 を削除して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 に答える
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)

各シフトタイプを取得するには、関数を作成する必要があると思います。デフォルトの callable がパラメーターを受け取るかどうかはわかりません。

于 2012-07-11T05:12:58.823 に答える