Установить значение по умолчанию внешнего ключа пользователя как суперпользователя или администратора on on_delete=models.SET_DEFAULT
Поскольку я использовал on_delete=models.CASCADE
с currentOwner
в модели asset
, всякий раз, когда я удалял любого пользователя, все активы, принадлежащие этому пользователю, удалялись. Я хочу, чтобы активы были переданы суперпользователю/админу. Поэтому я попробовал # MY SOLUTION
, но он выдает ошибку:
ValueError: Field 'id' expected a number but got 'admin'.
Я думаю, что удаление предыдущих миграций и выполнение команд makemigrations и migrate может помочь, но это, вероятно, сотрет все данные в базе данных, чего я не хочу. Вот мои модели пользователей и активов:
class User(PermissionsMixin, AbstractBaseUser):
username = models.CharField(max_length=32, unique=True, )
email = models.EmailField(max_length=32)
gender_choices = [("M", "Male"), ("F", "Female"), ("O", "Others")]
gender = models.CharField(choices=gender_choices, default="M", max_length=1)
nickname = models.CharField(max_length=32, blank=True, null=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
REQUIRED_FIELDS = ["email", "gender"]
USERNAME_FIELD = "username"
objects = User_manager()
def __str__(self):
return self.username
class asset(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, null=False)
asset_type = models.ForeignKey('assetType', on_delete=models.CASCADE, null=True)
asset_name = models.CharField(max_length=30, null=True) #unique=True
location = models.CharField(max_length=30, null=True)
brand = models.CharField(max_length=30, null=True)
purchase_year = models.PositiveIntegerField(blank=True, null=True)
isActive = models.BooleanField(default=True, null=True)
currentOwner = models.ForeignKey(User, default=User.objects.get(is_superuser=True).id, null=False, on_delete=models.SET_DEFAULT) # MY SOLUTION
Есть ли способ решить эту проблему?
для значения по умолчанию можно задать function
имя.
Функция models.SET_DEFAULT
проверяет, является ли default
именем callable
и вызывает эту функцию по имени. Результат будет установлен в качестве значения для этого поля.
подробнее здесь: https://docs.djangoproject.com/en/4.1/ref/models/fields/#default
в вашем случае:
def get_superuser():
su_user = User.objects.filter(is_superuser=True).first() # if you have more than 1 superuser, this get the first in list.
if su_user:
return su_user.pk
raise DoesNotExist('Please add Super User')
class asset(models.Model):
... # any staff here
currentOwner = models.ForeignKey(User, default=get_superuser, null=False, on_delete=models.SET_DEFAULT)
Решением здесь было удаление всех миграций, кроме первой, а затем выполнение команд makemigraions и migrate. Поскольку мы не удаляли базу данных, мы не потеряли наши записи.