Django Models - FK по умолчанию для последней введенной записи (зарегистрированным пользователем) - PullRequest
2 голосов
/ 12 марта 2009

У меня есть 2 модели в вопросе. JobRecord, в котором есть много Activity (s), fk, конечно, помещены в модель Activity.

Чтобы облегчить ввод данных, я хотел бы по умолчанию установить fk на JobRecord, в рамках нового действия, на «JobRecord fk последнего введенного действия, зарегистрированного пользователя (бонусные баллы!)»

Вот модель:

class Activity(models.Model):
    """
    Record multiple activities against a JobRecord
    """

    start               = models.TimeField(blank=True, null=True)
    end                 = models.TimeField(blank=True, null=True)
    job_record          = models.ForeignKey(JobRecord) # editable=False)
    task                = models.ForeignKey(Task, blank=True, null=True) # show only tasks found in project
    flora               = models.ManyToManyField(Species, blank=True, null=True, help_text='Optional subject flora.')

    memo                = models.TextField(blank=True, null=True)

    all_operators       = models.BooleanField(help_text="Check to include all operators from the parent job record")
    operators           = models.ManyToManyField(User, null=True, blank=True)

    duration            = models.DecimalField(blank=True, null=True, max_digits=7, decimal_places=2)

    class Meta:
        #order_with_respect_to = 'job_record' # not working?
        ordering = ['-job_record__date', 'job_record', 'start']

Спасибо!

1 Ответ

1 голос
/ 12 марта 2009

В качестве первого шага вы должны сохранить в какой-либо модели последнее действие для каждого пользователя.

class ActivityLog(models.Model)
    user = models.ForeignKey(User)
    job_record = models.ForeignKey(JobRecord)

Затем в представлении вы можете получить действие с помощью простого запроса:

last_activity_data = ActivityLog.objects.filter(user=request.user)

и использовать его при инициализации формы для модели:

form = ActivityForm(job_record=last_activity_data.job_record)

наконец, не забудьте обновить журнал при сохранении действия.

Примечание: я пропустил все проверки ошибок; например, вы должны позаботиться о случае, когда last_job_record нет, но это должно быть довольно тривиально.

Наконец, вы также можете использовать ManyToManyField для Activity, а затем использовать API Django; это было бы идеально эквивалентно (например, это создало бы таблицу, очень похожую на эту за кулисами), но я думаю, что семантика была бы немного другой, и по этой причине я предпочел бы явное решение.

...