【问题标题】:Filtering on foreign key relationship - Django过滤外键关系 - Django
【发布时间】:2013-07-20 19:59:29
【问题描述】:

我想查找特定用户为其创建了articlehistory 记录的articles 的数量。
模型如下所示:

class Article(models.Model):
    """The basic entity of this app.)"""
    documentID = models.CharField(blank=True, max_length=1000)
    cowcode = models.IntegerField(blank=True, null=True)
    pubdate = models.DateField(default=datetime.datetime.today)
    headline = models.CharField(blank=True, max_length=1500)
    source = models.CharField(blank=True, max_length=5000)
    text = models.TextField(blank=True, max_length=1000000)
    assignments = models.ManyToManyField(Assignment)

    class Meta:
        ordering = ['pubdate']

    def __unicode__(self):
            return self.headline

class ArticleHistory(models.Model):
    """(Modelname description)"""
    article = models.ForeignKey(Article, related_name='Article History')
    coder = models.ForeignKey(User, related_name='Article History')
    last_updated = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return self.last_updated

我现在尝试这样做的方式是这样的:

assignment.finished_articles = Article.objects.filter(cowcode=country).filter(pubdate__range=(start_date,end_date), articlehistory__coder=request.user.id).count()

但是这不起作用,并且表现出另一种奇怪的行为:
我尝试这样做:

for assignment in assignments:
    country = assignment.country.cowcode
    start_date = assignment.start_date
    end_date = assignment.end_date
    articles = Article.objects.filter(cowcode=country).filter(pubdate__range=(start_date,end_date)).select_related()
    assignment.article_num = articles.count()
    #assignment.finished_articles = Article.objects.filter(cowcode=country).filter(pubdate__range=(start_date,end_date), articlehistory__coder=request.user.id).count()

这很好用,除非我尝试包含finished_articles,否则article_num 会缩短为一个结果。

如果有人能指点谁来解决这个问题,那就太好了。

【问题讨论】:

    标签: django filtering django-queryset


    【解决方案1】:

    利用参数related_name创建的ForeignKey的反向关系:

    1. 将属性相关名称重命名为"article_history_set"
    2. 现在,它为您提供了简单的指针:user.article_history_set 是一组 Article History 对象,其中 coder 设置为此用户。
    3. 然后你可以通过article_history.article找到它与哪篇文章相关。
    4. 最后,您必须摆脱重复并获得该列表的长度。

    这里有更多关于related_name 属性的信息:https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

    【讨论】:

    • 谢谢! 1. 你的意思是把coder = models.ForeignKey(User, related_name='Article History') 改成coder = models.ForeignKey(User, related_name='article_history_set'),对吧?
    • 其实,related_name="whatever_you_want_but_without_spaces"。此字符串将用作用户属性的名称:user.whatever_you_want_but_without_spaces。所以,我不认为带空格的名字会起作用;)
    猜你喜欢
    • 2018-08-28
    • 2015-12-20
    • 2021-01-04
    • 2012-11-18
    • 2020-10-08
    • 2020-09-07
    • 2012-01-23
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多