django 2 внешних ключа от одной модели к другой модели - PullRequest
2 голосов
/ 23 декабря 2010

Есть ли способ, чтобы два внешних ключа в модели относились к одной и той же модели. В этом примере я хочу, чтобы 'date' и 'supervisor' из расписания работали как внешние ключи для DateTimesheet. Я пытаюсь добиться того, чтобы расписание работ было встроено в DateTimesheet у администратора, и чтобы я мог ввести дату и руководителя один раз, а затем ввести несколько расписаний, не вводя дату или руководителя для каждого расписания.

class DateTimesheet(models.Model):
    date = models.DateField()
    supervisor = models.ForeignKey(User)
    class Meta:
        verbose_name = 'Daily Timesheet'
        unique_together = (('date', 'supervisor'),)

    def __unicode__(self):
        return '%s | %s' % self.date.strftime("%A, %B %d.")

class Timesheet(models.Model):
    date = models.ForeignKey(DateTimesheet)
    supervisor = models.ForeignKey(DateTimesheet)
    job = models.ForeignKey(Job)
    phase = models.ForeignKey(Phase)
    equip = models.ForeignKey(Equipment, null=True, blank=True)
    employee = models.ForeignKey(Employee)
    local = models.ForeignKey(Local)
    pay_class = models.ForeignKey(PayClass)
    reg = models.IntegerField(max_length=1)
    ot = models.IntegerField(max_length=2, null=True, blank=True)
    bill_rate = models.DecimalField(decimal_places=2,max_digits=6, blank=True,null=True)
    bill_hours = models.IntegerField(max_length=2,blank=True,null=True,)

Ответы [ 3 ]

8 голосов
/ 23 декабря 2010

Если у вас есть внешние ключи на одной модели, указывающие на ту же модель, вы должны установить fk_name на соответствующем встроенном администраторе :

class DateInline(admin.TabularInline):
    model = DateTimeSheet
    fk_name = "date"
3 голосов
/ 23 декабря 2010

Да. Дайте им разные значения для related_name.

0 голосов
/ 23 декабря 2010

это не проблема.

Вы должны получить ошибку о необходимости указать related_name, и эта информация должна решить вашу проблему.

Вы должны указать models.ForeignKey(DateTimeSheet, related_name="something_else"), иначе django будет жаловаться на то, что менеджеры обратных отношенийнужны уникальные имена.

Чтобы уточнить: related_name - это то, что вы используете в обратном поиске, например: datetimesheet.timesheet_set.all()

Когда у вас есть два внешних ключа для DateTimesheet, django должен иметь возможностьразличать два внешних ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...