相关疑难解决方法(0)

处理model.save()中的竞争条件

如何在模型的save()方法中处理可能的竞争条件?

例如,以下示例实现具有相关项的有序列表的模型.创建新项目时,当前列表大小用作其位置.

据我所知,如果同时创建多个项目,这可能会出错.

class OrderedList(models.Model):
    # ....
    @property
    def item_count(self):
        return self.item_set.count()

class Item(models.Model):
    # ...
    name   = models.CharField(max_length=100)
    parent = models.ForeignKey(OrderedList)
    position = models.IntegerField()
    class Meta:
        unique_together = (('parent','position'), ('parent', 'name'))

    def save(self, *args, **kwargs):
        if not self.id:
            # use item count as next position number
            self.position = parent.item_count
        super(Item, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我遇到过@transactions.commit_on_success()但这似乎只适用于视图.即使它确实适用于模型方法,我仍然不知道如何正确处理失败的事务.

我当前正在处理它,但它感觉更像是一个黑客而不是一个解决方案

def save(self, *args, **kwargs):
    while not self.id:
        try:
            self.position = self.parent.item_count
            super(Item, self).save(*args, **kwargs)
        except IntegrityError:
            # chill out, then …
Run Code Online (Sandbox Code Playgroud)

python database django django-models race-condition

17
推荐指数
1
解决办法
3663
查看次数

自动增加django后端的发票号以获取新发票

我想自动增加发票号码,即3位字符和4位数字.

class Invoice:
    invoice_no = models.CharField(max_length=500, null=True, blank=True, validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',message='Invoice must be Alphanumeric',code='invalid_invoice number'),])
Run Code Online (Sandbox Code Playgroud)

我在后端注册了这个模型.但是现在当我点击在admin中创建发票时,发票应该自动填写.当我再次点击在admin中创建新发票时,invoice_number应该加1并且应该是auto字段.

发票编号为MAG0001,MAG0002,MAG0003等的Ex,当我点击创建新发票时,这应该是管理员中的自动字段.

python django django-admin django-admin-filters django-admin-tools

6
推荐指数
1
解决办法
3841
查看次数