Наконец я нашел ответ сам. Если кому-то это нужно, вот оно:
(1) Отключить validate_unique для уникальных полей в модели:
def validate_unique(self, exclude=None):
super().validate_unique(exclude='host')
Эта проверка вызывается перед действиями save_model () или save (). Так что любые другие изменения будут бесполезны.
(2) Метод сохранения с переопределением:
def save(self, *args, **kwargs):
proxy = Proxy.objects.get(host=self.host, port=self.port)
if proxy:
self.id = proxy.id
super().save(*args, **kwargs, update_fields=["login", "password"])
else:
super().save(*args, **kwargs)
Нет update_or_create () или что-то подобное, здесь не работает, потому что они приводят к бесконечной рекурсии. Просто обновить или сохранить метод (даже с параметром force_update) тоже не работает, потому что у текущего объекта еще нет идентификатора. Поэтому нам нужно получить этот идентификатор, если такой объект существует, и обновить его или просто создать новый объект.