ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-10 16:58:36  阅读:231  来源: 互联网

标签:aggregation python django-models


我正在与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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有