django更新行(如果行已存在)

yizd12fk  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(360)

我有个模特说,

class ABC(models.Model):
    x = models.CharFeild(max_length=100)
    y = model.IntegerFeild(default=1)

另一种模式是,

class XYZ(models.Model):
        a = models.CharFeild(max_length=100)
        abc = model.ForeignKey(ABC, db_index=True)

我现有的数据库看起来像,

ABC
id x  y
1  a  10
2  b  20
3  c  30
.   .  .
.   .   .

XYZ
id  a  abc_id
1   x  1
2   y  2
3   z  3
.   .  . 
.   .  .

所以现在我想更新这个字段,如果它在模型xyz中存在,也就是说,更改列'a'的值,其中\u id=1、2或3,如果这个\u id不存在,那么创建一个新行。

ocebsuys

ocebsuys1#

使用 update_or_create() 查询集方法

new_value = {"a": "new value"}

XYZ.objects.update_or_create(abc_id=1,defaults=new_value)

注意:我不确定是否可以添加逻辑或条件 update_or_create() 方法
更新
这也可以通过,

defaults = {"a": "new value"}
try:
    obj = XYZ.objects.get(abc_id=1)
    for key, value in defaults.items():
        setattr(obj, key, value)
    obj.save()
except XYZ.DoesNotExist:
    new_values = {"abc_id": 1}
    new_values.update(defaults)
    obj = XYZ(**new_values)
    obj.save()
dw1jzc5e

dw1jzc5e2#

有很多方法来更新记录,如果存在,在我下面的例子中,我将创建一个公司简介模型,这将只使用一次的网站,它不应该重复,因为你会看到我们将使用'comp\u prof\u identity'的默认值来检查/更新记录,如果存在,如果没有创建它。
model.py文件:

class Company_Profile(models.Model):
    COMP_Company_Name = models.CharField(max_length=40, default='Company Name')
    COMP_Company_Website = models.CharField(max_length=50, default='www.yourdomain.tld')
    COMP_Prof_identity = models.CharField(max_length=40, default='Company_identity', unique=True )

视图.py

def f_company_profile(request):

    if request.method == 'POST':
        q_Company_Name = request.POST.get("q_Company_Name")
        q_Company_Website = request.POST.get("q_Company_Website")

    if q_Company_Name and q_Company_Website:

        Company_Profile_exist = False

        try:
            Company_Profile_exist = Company_Profile.objects.get(COMP_Prof_identity='Company_identity')

        except:
            pass

        if Company_Profile_exist:

            try:
                Company_Profile_exist.COMP_Company_Name = q_Company_Name
                Company_Profile_exist.COMP_Company_Website = q_Company_Website
                Company_Profile_exist.save()
            except:
                messages.warning(request, "sorry, can't update company name ")

        else:
            try:
                Company_Profile.objects.create(COMP_Company_Name=q_Company_Name,
                                               COMP_Company_Website=q_Company_Website
                                               )
            except:

                messages.warning(request, "sorry, can't Create company name ")

我希望这对你有帮助,这只是一个例子,得到的概念,你可以使用这个概念,并使用它在你想在不同的情况下。

相关问题