Django更新该行(如果已存在)

时间:2018-12-07 06:11:54

标签: python mysql django django-models django-queryset

我有模特儿说

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中),即在abc_id = 1或2或3的地方更改列'a'的值,如果该abc_id不存在,则创建一个新行。

2 个答案:

答案 0 :(得分:2)

使用QuerySet的update_or_create()方法

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

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

注意:我不确定是否可以通过 update_or_create()添加 LOGICAL OR 条件方法


更新

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()

答案 1 :(得分:0)

有多种更新记录的方法(如果存在), 在下面的示例中,我将创建一个公司资料模型,该模型仅用于 1次访问网站,并且不应重复, 如您所见,我们将使用 带有默认值的'COMP_Prof_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 )

在view.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 ")

我希望这对您有所帮助, 这只是获得概念的一个例子 您可以使用此概念,并在其他情况下在需要的地方使用它。