从多个模型Djang获取模型方法中的数据

2024-06-16 11:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Django(Python)也很陌生,并通过实践来学习它。在

我在玩Django管理网站。我已经创建了两个模型,并成功注册在管理。对于list_display中给定的字段,数据显示得很好。 我想要一个管理中的另一个表,它通过一些逻辑处理来显示两个表中的数据。在

为了获得基于前两个模型数据的另一个表,我可以用这个question中提到的方法创建一个新模型。在

现在的问题是,如何从其他模型表中获取数据,以及如何返回,以便它可以显示在管理中的表中。在

这是我的模型.py公司名称:

from django.db import models


class GoodsItem(models.Model):
    name = models.CharField(max_length=255)
    size = models.DecimalField(max_digits=4, decimal_places=2)
    INCHES = 'IN'
    NUMBER = 'NUM'
    GOODS_ITEM_SIZE_UNITS = (
        (INCHES, 'Inches'),
        (NUMBER, '#'),
    )
    size_unit = models.CharField(
        max_length=4,
        choices=GOODS_ITEM_SIZE_UNITS,
        default=INCHES,
    )

    def __str__(self):
        if(self.size_unit == self.NUMBER):
            return "%s #%s" % (self.name, (self.size).normalize())
        else:
            return "%s %s\"" % (self.name, (self.size).normalize())


class FinishedGoodsItem(models.Model):
    date = models.DateField()
    goods_item = models.ForeignKey(GoodsItem, on_delete=models.CASCADE, related_name="finished_name")
    weight = models.DecimalField(max_digits=6, decimal_places=3)

    def __str__(self):
        return str(self.goods_item)


class SoldGoodsItem(models.Model):
    goods_item = models.ForeignKey(GoodsItem, on_delete=models.CASCADE, related_name="sold_name")
    date = models.DateField()
    weight = models.DecimalField(max_digits=6, decimal_places=3)

    def __str__(self):
        return self.goods_item

管理中的第三个表应显示如下数据:

^{pr2}$

这里GoodsItem是GoodsItem模型的字符串表示,可用库存应计算为:

到最后一次入关(即最后一次入关日期)为止,特定货物的成品货物重量之和(即最后一次入关日期)特定货物的货物重量之和

如果有人告诉我如何在模型中用不同的方法查询和返回数据,我将实现这个逻辑。如果有任何疑问,尽管问。在


Tags: 数据name模型selfsizemodelreturnmodels
1条回答
网友
1楼 · 发布于 2024-06-16 11:36:51

我知道您希望每个GoodsItem对象一行。您可以直接将“stock available”列添加到GoodsItem管理员,而无需创建单独的模型,正如danielroseman所说。在

示例代码(可能不是100%正确,但您了解要点):

class GoodsItem(models.Model):
    # ...
    @property
    def stock_available(self):
        stock_finished = self.finished_name.aggregate(Sum('weight'))['weight__sum']
        stock_sold = self.sold_name.aggregate(Sum('weight'))[
            'weight__sum']
        return stock_finished - stock_sold


class GoodsItemAdmin(admin.ModelAdmin):
    # ...
    list_display = ('name', 'size', 'size_unit', 'stock_available')

参见Django docs on aggregation。请记住,这将为列表中显示的每个项目执行两个额外的查询。在


编辑:下面建议的解决方案不起作用,原因是Django错误,其中描述了here的聚合和多个表,如注释中所强调的那样。使用使用子查询的this answer。在

如果前一个解决方案由于许多查询而速度太慢,则另一个选择是:

^{pr2}$

请注意,最后一个选项只将特性添加到管理员,但这可能就足够了。在

相关问题 更多 >