Ego*_*kov 2 python django web-services django-models django-admin
有一个模型:
class Proxy(models.Model):
host = models.CharField(max_length=100,)
port = models.CharField(max_length=10,)
login = models.CharField(max_length=100,)
password = models.CharField(max_length=100,)
class Meta:
unique_together = ("host", "port")
Run Code Online (Sandbox Code Playgroud)
我在管理界面添加了一批代理,其中之一是0.0.0.0:0000,登录名=123,密码=123。然后我添加另一批代理,其中一个是相同的 0.0.0.0:0000,但新的登录名 = 234 和密码 = 234。是否有可能覆盖模型的保存方法以获得诸如“插入......冲突(主机,端口)时更新设置登录=登录,密码=密码”之类的行为。Django 2,db - Postgres。
最后我自己找到了答案。如果有人需要的话,这里是:
(1) 在模型中的唯一字段上停用 validate_unique:
def validate_unique(self, exclude=None):
super().validate_unique(exclude='host')
Run Code Online (Sandbox Code Playgroud)
此检查在 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)
Run Code Online (Sandbox Code Playgroud)
update_or_create() 或类似的方法在这里不起作用,因为它们会导致无限递归。仅更新或保存方法(即使使用force_update选项)也不起作用,因为当前对象还没有id。因此,如果此类对象存在,我们需要获取该 id 并更新它或只是创建新对象。
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |