Я создаю объект, который отслеживает изменения (обновления), касающиеся создания, обновления и удаления других так называемых UUIDSyncable
объектов в базе данных.
Сюда входит любой объект, который расширяет методы save()
и delete()
классов UUIDSyncable
, замещаемый таким образом, что он создает новый Update
объект, записывающий действие (вставку, обновление или удаление), и первоначально поле models.CharField(max_length=64)
, определяющее pk UUID для из UUIDSyncable
объектов.
На этом этапе я хотел обновить реализацию, чтобы использовать поле Django generic.GenericForeignKey()
вместо моего односимвольного поля. Это позволит получить доступ к объекту, о котором записывается обновление, гораздо более простым способом.
Моя проблема возникает, когда вы хотите удалить объект и сохранить его как объект Update
, поскольку вы знаете, что Django выполняет каскадное удаление удаляемого объекта UUIDSyncable
, удаляя все предыдущие записи Update
(что нежелательно).
Когда объект UUIDSyncable
был удален в моей исходной реализации, каждый объект Update
по-прежнему сохранял бы UUID, чтобы информировать внешние стороны о своем удалении. Моим первым решением для эмуляции этого было установить content_object = None
непосредственно перед удалением объекта на всех Update
объектах, что предотвратило каскад удаления.
Кажется, что generic.GenericForeignKey()
не может быть разрешено NULL
значения. Есть ли способ сделать это, а если нет, то как можно аналогичным образом использовать стандартный CharField
, содержащий первичный ключ UUID, и Sperate CharField
, содержащий название модели?