编程语言
首页 > 编程语言> > python-Django模型:在不存在外键关系的情况下如何返回默认值?

python-Django模型:在不存在外键关系的情况下如何返回默认值?

作者:互联网

我正在与Django(德语-瑞典语)一起开发词汇培训计划.

该应用程序的词汇表数据由大量“词汇卡”组成,每个词汇卡包含一个或多个德语单词或与一个或多个瑞典术语相对应的术语.

培训仅适用于注册用户,因为该应用通过保存每张词汇卡的分数来跟踪用户的表现.

词汇卡具有一个级别(基本,高级,专家)和分配给它们的任意数量的标签.

当注册用户开始培训时,应用程序需要为每个级别和标签计算用户的平均分数,以便他可以进行选择.

我通过引入一个名为CardByUser的模型解决了这个问题,该模型具有一个得分和字段以及与模型User和Card的ForeignKey关系.现在,我可以使用Django的聚合函数计算平均得分.

最大的缺点是:仅当数据库中当前存在的每个Card实例都有一个CardByUser实例时,这才有效,即使用户仅训练了100张卡.我当前的解决方案是在创建Card时以及注册用户时创建所有那些CardByUser实例.当然,这在数据库内存和计算时间上都是相当低的(注册用户需要相当长的时间).

似乎很不雅致,哪怕我最讨厌.

有一个更好的方法吗?

在计算Card的平均得分时,也许可以告诉Django以下信息:

>如果存在给定卡和用户的CardByUser,请使用其得分.
>如果CardByUser不存在,请使用默认值->得分0.

能做到吗?如果是这样,怎么办?

编辑:澄清
感谢S.Lott的第一个答案,但我认为我的问题更加复杂.不好的是,我试图用我的模型中的一些实际代码来阐明.

class Card(models.Model):
    entry_sv = models.CharField(max_length=200)
    entry_de = models.CharField(max_length=200)
    ... more fields ...

class CardByUser(models.Model):
    user = models.ForeignKey(User)
    card = models.ForeignKey(Card, related_name="user_cards")
    score = models.IntegerField(default=0)
    ... more fields ...

这意味着许多CardByUser对象与单个Card相关.

现在,在我的视图代码中,我需要创建一个CardByUser对象的查询集,以满足以下条件:

>相关Card对象的tag字段包含一个特定的字符串(我现在也不是最优的,但不是我的问题的重点…)
>用户是当前用户

然后,我可以汇总分数.我当前的代码如下所示(缩短):

user_cards = CardByUser.objects.filter(user=current_user)
                               .filter(card__tags__contains=tag.name)
avg = user_cards_agg.aggregate(Avg('score'))['score__avg']

如果当前用户和Card的CardByUser不存在,则它将根本不包括在聚合中.这就是为什么我创建所有那些得分为0的CardByUsers的原因.

那我该如何摆脱这些呢?任何想法,将不胜感激!

解决方法:

这就是方法(也许是属性)的目的.

class OptionalFKWithDefault( models.Model ):
    another = models.ForeignKey( AnotherModel, blank=True, null=True )
    @property
    def another_score( self ):
        if self.another is None:
            return 0
        else:
            return self.another.score

标签:aggregation,python,django-models
来源: https://codeday.me/bug/20191210/2102904.html