Добавьте проверку валидности unique_together на внутренние атрибуты JSONField
Я использую следующую модель.
class MyProfile(models.Model):
name = models.CharField(max_length=100, default=None)
account_id = models.CharField(max_length=64, default=None)
prof_config = JSONField(null=True, blank=True, default=None)
result = JSONField(null=True, blank=True, default=None)
class Meta(object):
app_label = "app"
verbose_name = "MyProfile"
unique_together = [["account_id", "prof_config"]]
Ранее prof_config
включал:
prof_config = {"username":"pranav","password":"123456"}
Но теперь я изменил его на :
prof_config = {"username":"pranav","password":"123456","last_sync_time":null}
А так как я хочу unique_together
валидацию только на account_id, имя пользователя и пароль.
Для этого я изменил unique_together
на:
unique_together = [["account_id", "prof_config__username","prof_config__password"]]
Но это не сработало. Он выдал мне следующую ошибку (если время последней синхронизации равно null для обоих профилей):
"Error while creating My Profile, error:duplicate key value violates unique
constraint \"app_myprofile_account_id_prof_config_b94a5cdc_uniq\"\nDETAIL: Key
(account_id, prof_config)=(4, {\"password\": \"123456\", \"username\": \"pranav\",
\"last_sync_time\": null}) already exists.\n", "causality": "", "opid": "fc3501fa",
"opid_chain": "fc3501fa", "level": "ERROR"}
Я получаю эту ошибку даже после того, как я добавил unique_together для account_id, username и password ([["account_id", "prof_config__username", "prof_config__password"]]). Но это все равно занимает целый prof_config
. А если время последней синхронизации отличается, то профиль создается
Есть ли способ сделать это.
Вы можете переопределить метод clean
в ModelForm и выполнить ручную валидацию
def clean(self):
cleaned_data = self.cleaned_data
# Your custom validation
...
# raise error if something is not right
raise ValidationError('Error')
return cleaned_data
Ошибка, с которой вы столкнулись, связана с существующими данными в вашей базе данных, Ошибка говорит, что в базе данных уже есть данные, которые не соответствуют вашему новому правилу уникальности
Вам следует найти и удалить/отредактировать конкретную запись, которая вызвала эту ошибку