Python 根据单词的重复增加模型整数字段
假设我有两个模型,一个盒子模型和一个物体模型。最后一个将Box作为外键。每个框都是字符串对象的容器,用户可以使用ModelForm添加这些对象。models.py应该是这样的: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=
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
)列添加一个唯一的键