У меня есть несколько взаимосвязанных моделей.
class Item(models.Model):
entity = models.ForeignKey(Entity, blank=True, null=True, related_name='items', on_delete=models.CASCADE)
class Entity(models.Model):
account = models.OneToOneField(Account, related_name='entity', on_delete=models.CASCADE)
class User(models.Model):
user = models.OneToOneField(User, related_name='account', on_delete=models.CASCADE)
Когда человек выполняет операцию (сохраняет, обновляет, активирует и т. Д.), Создается уведомление.
actor - who did the operation # User
recipient - who owns the Object # User
action_object - объект, получивший операцию
class Notification(models.Model):
actor = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name='actor_notification',
on_delete=models.SET_NULL)
recipient = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
related_name='recipient_notification', on_delete=models.SET_NULL)
verb = models.CharField(choices=NOTIFICATION_VERB_CHOICES, max_length=5, blank=True, null=True)
action_object также должен быть ForeignKey, но когда создается уведомление, я хочу получить его «родителей», если он существует, например:
Actor | Recipient | Account | Entity | Item | Verb
users1 user2 acc-user2 e32 i14 create
user1 user3 acc-user3 -- --- create
user1 user4 acc-user4 e34 --- update
user1 user5 ----- --- --- create
Наб. Я знаю, что у Django есть GenericForeignKey, но это не вариант для
мне. Я проверил другие приложения уведомлений, они не делают точно, что я
хочет
Я думаю использовать отдельный класс для action_object, потому что у меня может быть больше классов, чем указано выше, потому что я думаю, что это понятнее, даже если я добавляю новую таблицу.
class AObject:
notification = models.OneToOneField(Notification, related_name='AObject', on_delete=models.CASCADE)
- Я не знаю, это лучшее решение
- Я хочу получить FK для action_object (Item) и т. Д. И «родителей» в уведомлении
- Я хочу не минимальное количество запросов при создании уведомлений, но и в DjangoAdmin при повторном извлечении (я видел в Admin в аналогичной модели переход к 100 запросам)