Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据单词的重复增加模型整数字段_Python_Django_String_Forms_Models - Fatal编程技术网

Python 根据单词的重复增加模型整数字段

Python 根据单词的重复增加模型整数字段,python,django,string,forms,models,Python,Django,String,Forms,Models,假设我有两个模型,一个盒子模型和一个物体模型。最后一个将Box作为外键。每个框都是字符串对象的容器,用户可以使用ModelForm添加这些对象。models.py应该是这样的: Things.objects.get_or_create(box=your_box, name=thing_name, default={'thing_number':0}) Things.objects.filter(box=your_box, name=thing_name).update(thing_number=

假设我有两个模型,一个盒子模型和一个物体模型。最后一个将Box作为外键。每个框都是字符串对象的容器,用户可以使用ModelForm添加这些对象。models.py应该是这样的:

Things.objects.get_or_create(box=your_box, name=thing_name, default={'thing_number':0})
Things.objects.filter(box=your_box, name=thing_name).update(thing_number=F('thing_number') + 1)
型号.py

class Box(models.Model):
name = models.CharField(max_length=120, unique=True)

def __str__(self):
    return self.name

class Things(models.Model):
    box = models.ForeignKey(Box)
    name = models.CharField(max_length=120)
    thing_number = models.PositiveIntegerField(default=1)

    def __str__(self):
        return self.name

现在,每当用户在表单中插入相同的字符串时,我想将“thing_number”整数字段增加1。有一种简单的方法吗?

我认为应该将
thing
thing\u number
字段默认为零。 如果你这样做了,那么你可以增加这个数字

thing, created = Things.objects.get_or_create(box=your_box, name=thing_name)
thing.things_number += 1
thing.save()
其他方面:

thing, created = Things.objects.get_or_create(box=your_box, name=thing_name,
                                              default={'thing_number':0})
thing.things_number += 1
thing.save()
----额外的

正如@e4c5所说,上面的代码可能会导致竞态条件,那么代码可以这样更改:

Things.objects.get_or_create(box=your_box, name=thing_name, default={'thing_number':0})
Things.objects.filter(box=your_box, name=thing_name).update(thing_number=F('thing_number') + 1)

您应该在
forms.py
文件中这样做。您能分享一下您的
表单.py吗?为什么需要这个?PK有什么问题吗?一点问题都没有,但是由于模型字段的更改取决于表单输入,我想在
clean_name
方法中包含“增量操作”。但是为什么呢?您正在存储冗余且可能不准确的数据,这会导致竞争条件。电源已根据您的建议更改。当您应该保留时,每个框中只有一个
东西具有相同的名称。对于您来说,应该在数据库中为Thing with(
name
box\u id
)列添加一个唯一的键