2014-09-22 5 views
0

Я пишу проект с целью построить что-то вроде менеджера (управление бизнесом, как сказать), используя 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

Возможно, вы должны сохранить файл в корневом каталоге django (каталог, из которого вы запускаете django), или вы можете использовать абсолютный путь в своем коде. Во всяком случае, я бы рекомендовал хранить product_code в базе данных вместо файловой системы (f.e. table globals, с двумя полями: variable_name и значение. – Jiri

ответ

0

Вы должны открыть файл в append режиме:

with open('product_code.txt', 'a') as handle: 
    ... 

Но я бы использовать другой метод (возможно, база данных), если вы не знаете, с самого начала, что вы не собираетесь, чтобы увидеть какие-либо условия гонки ,

Смежные вопросы