Добавьте проверку валидности 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

Ошибка, с которой вы столкнулись, связана с существующими данными в вашей базе данных, Ошибка говорит, что в базе данных уже есть данные, которые не соответствуют вашему новому правилу уникальности

Вам следует найти и удалить/отредактировать конкретную запись, которая вызвала эту ошибку

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