Как использовать dumpdata и loaddata для Django Groups с некоторыми правами?

В процессе написания тестовых примеров мне потребовались фикстуры или, можно сказать, json-данные для предварительного заполнения базы данных. У меня есть проект, который использует модели Django Groups и Permissions.

Теперь, когда я использую команду для дампа данных python manage.py dumpdata auth.Groups > fixtures/groups.json Она сбросит все данные в файл groups.json, как показано ниже.

Примечание: группы добавляются на лету, то есть когда запускается определенная форма регистрации, она создаст определенную группу, а также добавит соответствующие разрешения в эту группу, которые я определил в коде. Но если группа уже создана, она не будет пытаться создать ее снова, а просто назначит эту группу пользователю.

enter image description here

Здесь разрешения перечислены в соответствии с их идентификаторами.

Примечание: Некоторые разрешения являются разрешениями по умолчанию, а другие - пользовательскими разрешениями, определяемыми в моделях.

Теперь я заново создал базу данных. Затем, мигрировал с помощью python manage.py migrate и создал несколько пользователей так, чтобы группы создавались динамически и права назначались этой группе, о чем я говорил выше. Затем снова использовал команду dump data, на этот раз идентификаторы были другими. Также, когда я проверил разрешения в группах в админ-панели django, он показал, что группе назначены другие разрешения, чем те, которые я закодировал.

Исходя из этого, я предполагаю, что всякий раз, когда я воссоздаю базу данных и вызываю команду migrate, она будет создавать все разрешения, но не всегда одинаковым образом. Таким образом, один объект разрешения может иметь разные id каждый раз, когда я пересоздаю базу данных.

Я попытался отредактировать файл groups.json, чтобы изменить идентификаторы на их кодовые имена, но он выдает ошибку, что список должен содержать int.

Вопрос: Возможно ли, чтобы у нас были кодовые имена разрешений вместо id, так чтобы каждая группа имела ожидаемые разрешения независимо от их id. Также, при загрузке данных, конкретная группа будет назначать разрешения конкретной группе только по их кодовым именам. Возможно ли это вообще?

Я нашел решение для подобных проблем здесь . Здесь вы можете увидеть концепцию естественных ключей. (в вашем случае для Permissions) Вы можете найти этот естественный ключ в Django PermissionManager, предоставляемый django по умолчанию django.contrib.auth.models

class PermissionManager(models.Manager):
   use_in_migrations = True
   def get_by_natural_key(self, codename, app_label, model):
       return self.get(
           codename=codename,
           content_type=ContentType.objects.db_manager(self.db).get_by_natural_key(
               app_label, model
           ),
       )

Так просто вы можете использовать dumpdata --natural-foreign вместо просто dumpdata. чтобы получить естественный ключ разрешения данных вместо идентификаторов.

Вернуться на верх