Создание уведомлений о действиях пользователя и включение в качестве данных FK вплоть до цепочки - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть несколько взаимосвязанных моделей.

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)
  1. Я не знаю, это лучшее решение
  2. Я хочу получить FK для action_object (Item) и т. Д. И «родителей» в уведомлении
  3. Я хочу не минимальное количество запросов при создании уведомлений, но и в DjangoAdmin при повторном извлечении (я видел в Admin в аналогичной модели переход к 100 запросам)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...