Django & Postgres: уникальное ограничение не применяется? "Космическая" кодировка? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть django модель:

class MyModel(models.Model):
    my_field = models.CharField(max_length=500, unique=True)
    ...

Как видите, "my_field" должно быть уникальным. Перед созданием нового объекта я запускаю

field_value: str = 'test 12/9'
try:
    o = MyModel.objects.get(my_field=field_value)
except MyModel.DoesNotExist:
    o = MyModel()
...

, чтобы проверить, существует ли объект с уникальным field_value. Все идет нормально. Теперь я понял, что у меня есть сотня «дублирующих» значений в my_field.

Вот точные скопированные значения из django admin:

  1. 2 StR 46/15
  2. 2 StR 46/15

Как видите, они кажутся одинаковыми. Но если я скопирую одно значение в другое поле в django admin и попытаюсь сохранить его, произойдет сбой из-за объекта, уже существующего с этим 'my_field'. Но при сохранении каждого объекта он не перестает работать.

Я использовал несколько инструментов для сравнения строк, я не смог найти разницу.

Есть ли способ, который django или postgres конвертирует эти строки где-то, чтобы они больше не были одинаковыми? Я что-то пропустил?

Спасибо за любую помощь!

ОБНОВЛЕНИЕ:

Я только что проверил двоичное представление своих строк, и кажется, пробелы декодируются по-разному.

Для 1-го пробела: "10100000"

Для 2-го пробела: "100000"

1 Ответ

0 голосов
/ 21 апреля 2020

Вы уверены, что звоните o.save() в своем блоке кроме? Когда вы просто вызываете MyModel(), вы просто создаете новый экземпляр объекта в памяти, он не автоматически поддерживается строкой в ​​базе данных, а только вызывает .save() для этого и должен проверять любые проверки целостности (например, не дублировать) как и ожидалось. Попробуйте следующее:

field_value: str = 'test 12/9'
o, created = MyModel.objects.get_or_create(my_field=field_value)
# use your object now, it's in-memory and backed by a row in the database
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...