Я пытаюсь разработать приложение Django, которое имеет встроенную логику вокруг временных состояний для объектов.Желание иметь возможность иметь отдельный объект, представляющий ресурс, в то время как атрибуты этого ресурса могут изменяться со временем.Например, желаемый вариант использования - запросить owner
ресурса в любой момент времени (в прошлом году, вчера, завтра, в следующем году, ...).
Вот то, с чем я работаю ...
class Resource(models.Model):
id = models.AutoField(primary_key=True)
class ResourceState(models.Model):
id = models.AutoField(primary_key=True)
# Link the resource this state is applied to
resource = models.ForeignKey(Resource, related_name='states', on_delete=models.CASCADE)
# Track when this state is ACTIVE on a resource
start_dt = models.DateTimeField()
end_dt = models.DateTimeField()
# Temporal fields, can change between ResourceStates
owner = models.CharField(max_length=100)
description = models.TextField(max_length=500)
Я чувствую, что мне нужно создать пользовательский интерфейс для взаимодействия с этим состоянием.Некоторые примеры использования (интерфейс полностью запущен) ...
# Get all of the states that were ever active on resource 1 (this is already possible)
Resource.objects.get(id=1).states.objects.all()
# Get the owner of resource 1 from the state that was active yesterday, this is non-standard behavior
Resource.objects.get(id=1).states.at(YESTERDAY).owner
# Create a new state for resource 1, active between tomorrow and infinity (None == infinity)
# This is obviously non standard if I want to enforce one-state-per-timepoint
Resource.objects.get(id=1).states.create(
start_dt=TOMORROW,
end_dt=None,
owner="New Owner",
description="New Description"
)
Я чувствую, что для создания трюков потребуется наибольшее количество пользовательской логики. Я хочу обеспечить, чтобы только один ResourceState
мог быть активным на Resource
для любого заданного момента времени. Это означает, что для создания некоторых ResourceState
объектов мне нужно будет настроить / удалить другие.
>> resource = Resource.objects.get(id=1)
>> resource.states.objects.all()
[ResourceState(start_dt=None, end_dt=None, owner='owner1')]
>> resource.states.create(start_dt=YESTERDAY, end_dt=TOMORROW, owner='owner2')
>> resource.states.objects.all()
[
ResourceState(start_dt=None, end_dt=YESTERDAY, owner='owner1'),
ResourceState(start_dt=YESTERDAY, end_dt=TOMORROW, owner='owner2'),
ResourceState(start_dt=TOMORROW, end_dt=None, owner='owner1')
]
Я знаю, что мне придется выполнять большую часть работы по определению логики, но есть ли какое-нибудь интуитивное место, куда я должен ее поместить?Предоставляет ли Django удобное место для создания этих методов?Если да, то где лучше всего их применять?Против объекта Resource
?Использование пользовательского Manager
для взаимодействия со связанными объектами ResourceState?
Перечитывание вышеизложенного немного сбивает с толку, но это тоже не простая тема !!Пожалуйста, дайте мне знать, если у кого-нибудь есть идеи, как сделать что-то подобное выше!
Спасибо за тонну!