2015-10-14 2 views
0

У меня есть модель робота, как:Какова хорошая практика для захвата статуса мгновенной модели в django?

class Robot(models.Model):  
    version = models.CharField(max_length=20) 
    can_version = models.CharField(max_length=20) 
    uuid = models.CharField(max_length=20) 
    power_status = models.PositiveSmallIntegerField(choices=POWER_STATUS) 
    working_status = models.PositiveSmallIntegerField(choices=WORKING_STATUS) 

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

Model audit не то, что я хочу, поскольку мне не нужно сохранять всю историю изменений, а только мгновенное состояние при возникновении ошибки. Я не хочу создавать новую модель, которая дублирует все поля Robot и используется для сохранения состояния Robot.

+0

как о регистраторе, например, [sentry] (https://github.com/getsentry/sentry) –

+0

@ Hedde van der Heide Потому что мне часто нужно запрашивать эту информацию, поэтому эффективность имеет значение. – lengxuehx

ответ

1

Похоже, что статус должен быть отдельной моделью/классом с FK роботу, таким образом ваш робот имеет «список» всех своих предыдущих статусов », и вам просто нужно запросить последние.

class ModelStatus(models.Model): 
    robot = models.ForeignKey(Robot) 
    power_status = models.PositiveSmallIntegerField(choices=POWER_STATUS) 
    working_status = models.PositiveSmallIntegerField(choices=WORKING_STATUS) 

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

Если вы не хотите, чтобы весь список, то вы можете просто иметь два OneToOneFields на ваш Robot

current_status = models.OneToOneField(ModelStatus, null=True) 
previous_status = models.OneToOneField(ModelStatus, null=True) 
+0

Это выбор, но на самом деле у меня много моделей, и я не люблю создавать ModelStatus для каждой модели. Кроме того, ModelStatus должен измениться либо при изменении его ссылочной таблицы. – lengxuehx

+0

@lengxuehx - Возможно, вы можете использовать наследование модели базы данных (общие поля затем расширены с помощью пользовательских). Что касается изменения, вы можете установить [Signal] (https://docs.djangoproject.com/en/1.8/topics/signals/) – Sayse

+0

Это классно, но наследование требует большой работы для текущего кода (необходимо создать многие абстрактные модели). – lengxuehx

Смежные вопросы