代码之家  ›  专栏  ›  技术社区  ›  CastleDweller

在Django中显示部分表格内联模型

  •  0
  • CastleDweller  · 技术社区  · 16 年前

    class BillHeader(models.Model):
        number = models.CharField(_('Bill number'), max_length=10, unique=True, \
        default=__number)
        client = models.ForeignKey(ClienteYProveedor, verbose_name=_('Client'))
        date = models.DateTimeField(_('Date'), default=datetime.now)
    
        def __unicode__(self):
            return str(self.number)
    
        class Meta:
            abstract = True
    
    class BillFooter(models.Model):           
        base_import = models.DecimalField(_('Base import'), max_digits=12, \
        decimal_places=2)
    
        class Meta:
            abstract = True
    
    class BillBody(models.Model):        
        description = models.CharField(_('Description'), max_length=200)
        amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
        discount = models.DecimalField(_('Discount'), max_digits=4, \
        decimal_places=2)
        price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
        unitaryprice = models.DecimalField(_('Unitary Price'), max_digits=12, \
        decimal_places=2)
    
        def __unicode__(self):
            return self.description
        class Meta:
            abstract = True
    
    class EmittedBill(BillHeader, BillBody, BillFooter):
        pass
    
    class ReceivedBill(BillHeader, BillBody, BillFooter):
        pass
    

    当用户添加寄出或收到的帐单时,我需要显示 BillHeader BillBody BillFooter 我需要 TabularInline .

    如果我在admin.py中将它们作为TabularInline,就会出现一个错误,表示它们需要 ForeignKey

    我的问题是:如何在管理中显示表格行而不造成混乱?。我可以不用抽象基类来做,但是另一个问题出现了,它在TabularInline中显示了另一个ForeignKey(如果你在EmmitedBills上,它在TabularInline和viceversa中显示了FK to ReceivedBills),我无法排除它们。

    抱歉,如果这是一个愚蠢的问题,但我不是一个程序员(这只是一个爱好),我真的让自己的数据模型一团糟。


    我会更好地解释:

    我有两种账单, Emitted Received 它们都显示在管理员主页上(这就是为什么我没有使用 BooleanField 标记它们)。这两种类型都有相同的字段,除了一个字段,bill number,它在 Emmitted


    更新

    我已经做了所有的事情,但我有一个问题,在我的新模型BillBody有两个FK的(EmmitedBill和ReceivedBill),他们显示在表格行。如何隐藏它们?field.exclude()给出一个错误。

    1 回复  |  直到 16 年前
        1
  •  2
  •   muksie    16 年前

    我不完全理解你的问题,但你可以用

    ForeignKey('ModelName')
    

    而不是

    ForeignKey(ModelName)
    

    如果 ModelName 模型尚未声明。也许这能解决你的问题。

    内联管理员(如 TabularInline )仅当您有一对多关系(由 ForeignKey 侧面。如果没有这样的外键,那么就不能使用内联管理。继承绝对不同于 .

    emitted received 账单。两者 收到 账单有相同的字段。此外,您希望每个账单都包含一个带有编号、客户机和日期的标题、一个或多个正文条目,其中每个条目存储您存储的信息 BillBody 和1个或更多的小数 base_number .


    一个可能更好的数据模型

    class Bill(models.Model):
        number = models.CharField(_('Bill number'), max_length=10, unique=True, default=__number)
        client = models.ForeignKey(ClienteYProveedor, verbose_name=_('Client'))
        date = models.DateTimeField(_('Date'), default=datetime.now)
    
        def get_total_price(self):
            return sum([entry.price for entry in self.entries])
    
    class BillEntry(models.Model):
        bill = models.ForeignKey(Bill, related_name='entries')
    
        description = models.CharField(_('Description'), max_length=200)
        amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
        discount = models.DecimalField(_('Discount'), max_digits=4, decimal_places=2)
        price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
        unitaryprice = models.DecimalField(_('Unitary Price'), max_digits=12, decimal_places=2)
    

    我漏掉了那本书 __unicode__ 方法。

    现在您有了来自的外键 BillEntry Bill base_import 所以我把这个忘了。

    如果你的 price 应该总是等于 amount*unitaryprice - discount amount*(unitaryprice-discount) get_total_price . 如果您想在查询数据库时计算它们,那么让它与Django一起工作就有点困难了。

    在最后一个例子中,您可以查看SQL视图,但我认为这对于初学者来说有点太难了。另一种选择是使用自定义SQL表达式:

    BillEntry.objects.extra(select={'price': 'amount*unitaryprice-discount'})
    

    这将在选择期间计算所有条目的价格。

    如果为发出和收到的账单添加两个子类并使用 multi table inheritance 然后您可以使用 比兰特里 比尔 .

    class EmittedBill(Bill):
        pass
    
    class ReceivedBill(Bill):
        pass
    

    您可能还需要考虑Django生成的数据库模型。通常,您只想在数据库中存储基本数据,而不想在页脚中存储计算数据。所以,如果价格是用一些公式和 unitaryprice , amount 数量 )忘记更新计算值 价格

    我也不明白为什么你要一个单独的页眉和页脚每个法案。模型不是真正的账单,它存储账单的信息。如果您希望有一个可见的页眉和页脚,那么您应该在视图层(模板)中而不是在模型本身中这样做。

    推荐文章