首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中,将子对象与父对象关联到每个实例?

在Django中,将子对象与父对象关联到每个实例?
EN

Stack Overflow用户
提问于 2020-08-05 18:30:33
回答 1查看 39关注 0票数 0

我有两个模型,一个Invoice模型和一个Expense模型。在创建发票时,用户应该能够添加发票的所有费用。一旦发票被创建-这些费用应该以某种方式被“检查”,这样一个新的发票就不会增加同样的费用。我需要对费用实例进行某种形式的检查,上面写着“已开具发票”之类的东西。不完全确定如何处理..set.filter(...)查询集--我的两个模型如下所示:

费用模型

代码语言:javascript
复制
class Expense(Model):
    cost = DecimalField(blank=True, null=True, max_digits=10, decimal_places=2)
    project = ForeignKey(Project, on_delete=CASCADE)
    user = ForeignKey(User, on_delete=CASCADE) 
    billable = BooleanField(default=False)
    expense_date = DateField()
    date_created = DateTimeField(auto_now_add=True)
    invoice = ForeignKey("finances.Invoice", blank=True, null=True, on_delete=SET_NULL, help_text="Optionally link this to an existing invoice")

发票模型

代码语言:javascript
复制
class Invoice(Model):
    issue_date = DateField(default=now)
    due_date = DateField()
    project = ForeignKey(Project, on_delete=CASCADE)
    amount = DecimalField(blank=True, null=True, max_digits=100, decimal_places=2)
    include_expenses = BooleanField(default=False, help_text='Check this box to include all expenses that are within the invoice billable date range')
    billable_start = DateField(help_text="Logged hours start date")
    billable_end = DateField(help_text="Logged hours end date")

我尝试在费用模型上添加一个查询集,如下所示:

代码语言:javascript
复制
    def get_billable_expenses(self):
        """Getting all expenses for selected billable period"""
        start_week = self.get_start_isoweek()
        end_week = self.get_end_isoweek()
        return self.project.expense_set.filter(
            expense_date__gte=self.billable_start, 
            expense_date__lte=self.billable_end,
            billable=True,
            invoice=self.id
        )

然后添加在保存发票时触发的信号:

代码语言:javascript
复制
@receiver(post_save, sender=Invoice)
def prepare_calculation_data(sender, instance=None, created=False, **kwargs):
    if created:
        expenses_to_add = []
        for expense in instance.get_billable_expenses():
            expense.invoice = instance
            expenses_to_add.append(expense)
        Expense.objects.bulk_update(expenses_to_add, ['invoice'])

不知道如何处理这个问题--我想我可以通过检查费用是否已经有与其有关联的发票来解决这个问题--如果没有--将它包括在新创建的发票中(如上面的get_billable_expenses()所示),但这意味着不会增加任何新的费用,因为invoice字段不会是空的。

对如何解决这个问题有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 15:22:31

我在我的Invoice模型上有两种方法来解决这个问题。一个查询未开具发票的费用:

代码语言:javascript
复制
    def get_billable_expenses(self):
        """Getting all expenses for selected billable period"""
        start_week = self.get_start_isoweek()
        end_week = self.get_end_isoweek()
        return self.project.expense_set.filter(
            expense_date__gte=self.billable_start, 
            expense_date__lte=self.billable_end,
            status='approved',
            billable=True,
            invoice__isnull=True
        )

然后在我的模板中显示这些费用如下:

代码语言:javascript
复制
    def get_linked_expenses(self):
        return self.project.expense_set.filter(
            invoice=self.id
        )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63271450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档