#django #django-admin
#django #django-admin
Вопрос:
Я использую Django Admin, и у меня есть такая модель:
class Item(models.Model):
id = models.CharField(max_length=14, primary_key=True)
otherId = models.CharField(max_length=2084, blank=True)
Я хочу, чтобы идентификатор был обязательным и уникальным, и я хочу, чтобы otherId был необязательным в форме администратора, но если указан otherId, он должен быть уникальным.
Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я создаю экземпляр Item с помощью формы администратора и не указываю otherId, Django пытается сохранить поле otherId как пустое значение, но это означает, что во второй раз, когда я пытаюсь сохранить экземпляр с пустым значением otherId, он нарушает столбецуникальное ограничение и сбой.
Мне нужно, чтобы Django проверил, является ли поле otherId ложным перед сохранением, и если оно ложное, не сохраняйте это пустое значение вместе с моделью. Возможно ли это?
Ответ №1:
Вы должны добавить unique=True
в поле otherId .
otherid = models.CharField(max_length=2084, blank=True, null=True, unique=True)
Django игнорирует уникальный или нет, если otherId пуст.
Комментарии:
1. Спасибо, установка null= True в моем случае фактически приводит к возможности отправки формы с учетом моей схемы БД (которая поддерживается за пределами Django). Однако я искал, чтобы узнать, как изменить запрос сохранения, чтобы я мог выборочно предотвращать сохранение ключей, если они имеют ложное значение.
Ответ №2:
Я не очень хорошо понял вопрос, но я думаю, вам нужно переопределить метод сохранения модели django и предоставить пользовательскую логику, указанную вами выше.
class Item(models.Model):
id = models.CharField(max_length=14, primary_key=True)
otherId = models.CharField(max_length=2084, blank=True)
def save(self, *args, **kwargs):
# handle you logic here
# check if self.id is empty string and do something about it
super(Item, self).save(*args, **kwargs)
Для каждой модели django также автоматически создает идентификатор поля для первичного ключа, который автоматически генерируется и увеличивается.
Комментарии:
1. Это в основном то, что я ищу, но я не могу понять, как предотвратить сохранение ключа, когда его значение равно falsey. У меня есть это: « def save(self, * args, ** kwargs): если не self.otherId: delattr(self, ‘otherId’) super(Item, self).save(*args, ** kwargs) « Но это приводит к ошибке «Запрос на сопоставление элементов не существует». ошибка при попытке сохранения без указания otherId. Есть идеи, как обойти это? Извините за запутанный вопрос.
Ответ №3:
Для отключения отправки пустого поля вы должны присвоить свойству null и blank значение False . Проверьте код. Также обратите внимание, что поле id автоматически добавляется в django, поэтому вам не нужно об этом упоминать.
class Item(models.Model):
otherId = models.CharField(max_length=2084, blank=False, null=False)
Комментарии:
1. На самом деле я не хочу требовать отправки otherId. Похоже, что добавление
null=True
фактически привело к тому поведению, которое я искал. Извините за запутанный вопрос.