Целочисленная математика в Django - PullRequest
1 голос
/ 26 января 2010
from django.db import models
from django.contrib.auth.models import User

class Product(models.Model):
name = models.CharField(max_length = 127)
description = models.TextField()
code = models.CharField(max_length = 30)
lot_no = models.CharField(max_length = 30)
inventory = models.IntegerField()
commited = models.IntegerField()
available = models.IntegerField()
reorder = models.IntegerField()
created_date = models.DateField(auto_now_add = True)
comment_user = models.ForeignKey(User, null=True)
comment_txt = models.TextField()

def __unicode__(self):
    return self.code + " - " + self.name + " - " + self.lot_no + " - " + str(self.created_date)

@property
def available(self):
    return self.inventory - self.commited

Я пытаюсь получить доступ, рассчитанный (инвентарь - сам), когда человек вводит данные для инвентаризации и фиксирует их в шаблоне администратора django. Но я не уверен, как.

Спасибо, Jon

Ответы [ 6 ]

3 голосов
/ 26 января 2010

Попробуйте переопределить метод save на модели:

def save(self, *args, **kwargs):
    "update number available on save"
    self.available = self.inventory - self.committed

    super(Product, self).save(*args, **kwargs)

Вы также можете поместить туда логику, которая бы что-то сделала, если бы self.available стало отрицательным.

2 голосов
/ 30 января 2010

Кажется, у вас могут быть две проблемы; перекрывающееся доступное свойство + поле и доступность не отображаются так, как вы ожидаете от администратора.

Выберите один из способов (свойство или поле), чтобы представить доступность, и используйте его. Дон и Сет показали способ сделать это, используя поле, а Даниэль и Игнасио предложили пойти со свойством.

Поскольку вы действительно хотите, чтобы это поле отображалось в админке, просто используйте поле; помогите ему help_text = "...", удалите @property и переопределите save ().

class Product(models.Model):
    # ...
    availability = models.IntegerField(help_text="(updated on save)")

    # Use Seth's save()
    def save(self, *args, **kwargs):
        self.availability = self.inventory - self.commited
        super(Product, self).save(*args, **kwargs)

Это не лучший способ сделать что-то с точки зрения нормализованных данных, но, вероятно, это будет самое простое решение вашей текущей проблемы.

Если вы используете транк вместо Django-1.1.1, вы также можете использовать readonly_fields в админке.

1 голос
/ 26 января 2010

Дон правильно, что у вас есть дублированное имя available, потому что у вас есть и поле, и свойство. Оставьте поле.

Это то, что я сказал, когда дал вам решение этой проблемы в вашем первоначальном вопросе - я прямо сказал: «Удалите существующее« доступное »поле». После половины решения никогда не сработает.

Однако я принципиально не согласен с Сетом и Доном, которые рекомендуют переопределить функцию save () для вычисления этого значения. Это абсолютно ненужное дублирование данных. Свойство является правильным решением.

1 голос
/ 26 января 2010

Вы связали и поле Django, и свойство vanilla Python с одним и тем же именем в вашей модели. Один из этих атрибутов маскирует другой, поэтому вы получаете неожиданное поведение в админке Django. Это почти наверняка не то, что вы хотите .

Переопределите метод сохранения и полностью удалите свойство def available.

Игнасио пытается помочь вам нормализовать ваши данные, не сохраняя информацию в вашей БД дважды. Это хорошая практика, которой следует следовать в общем случае, но часто вы хотите сохранить вычисленные значения в вашей БД. Это похоже на практическое использование дублирования данных.

0 голосов
/ 26 января 2010

См. Документацию Django для свойств модели

0 голосов
/ 26 января 2010

Свойство фактически удаляет доступное целочисленное поле со страницы администратора, как кажется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...