我正在编写一个项目,其目标是使用Django构建类似管理(业务管理,怎么说)的东西。
实际上,我需要全局变量的支持,因为产品是由增加的代码识别的,有时我重置(它不是主键,只是我用来工作的代码)。 因此,为了避免使用全局变量,也是由于服务器重新启动时会出现的问题,我想在文本文件中编写实际代码。
使用保存方法覆盖我保留在此文件中写入的数字,并使用它来填充产品代码字段。然后我增加文件中写入的数字并关闭它。这样,我只需要写" 0" (零)用文件中的文本编辑器重置代码!如果服务器重新启动,我不会像使用其他方法那样丢失实际数字(即:保存在缓存中的变量)
我遇到的错误是:没有名为product_code.txt的文件/目录
这里是模型的代码:
class Product(models.Model):
code = models.AutoField(primary_key=True, editable=False)
#category = models.ForeignKey(Category)
product_code = models.IntegerField(editable=False, blank=True, null=True, verbose_name="codice prodotto")
description = models.CharField(max_length=255, verbose_name="descrizione")
agreed_price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="prezzo accordato")
keeping_date = models.DateField(default=datetime.date.today(), verbose_name="data ritiro")
selling_date = models.DateField(blank=True, null=True, verbose_name="data di vendita")
discount = models.SmallIntegerField(max_length=2, default=0, verbose_name="sconto percentuale applicato")
selling_price = models.DecimalField(
max_digits=5, decimal_places=2, blank=True, null=True, verbose_name="prezzo finale"
)
sold = models.BooleanField(default=False, verbose_name="venduto")
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
if self.product_code is None:
handle = open('product_code.txt', 'r+')
actual_code = handle.read()
self.product_code = int(actual_code)
actual_code = int(actual_code) + 1 # Casting to integer to perform addition
handle.write(str(actual_code)) # Casting to string to allow file writing
handle.close()
if self.sold is True:
if self.selling_date is None or "":
self.selling_date = datetime.date.today()
if self.selling_price is None:
self.selling_price = self.agreed_price - (self.agreed_price/100*self.discount)
super(Product, self).save()
class Meta:
app_label = 'business_manager'
verbose_name = "prodotto"
verbose_name_plural = "prodotti"
文件product_code.txt
位于models.py
的同一目录中
我确保错误参考代码行
handle = open('product_code.txt', 'r+')
因为我用调试器检查了它。
有什么想法解决这个问题吗?谢谢
答案 0 :(得分:0)
您应该以{{1}}模式打开文件:
append
但我会考虑使用另一种方法(可能是数据库),除非你从一开始就知道你不会看到任何竞争条件。