基于外键过滤

时间:2019-01-27 01:30:31

标签: django django-orm

所以我已经在这个问题上工作了很多天,无法使它起作用。基本上我有三种模式

class Year(models.Model):
    year = models.CharField()


class Book(models.Model):
     name = models.CharField(
        verbose_name = "Library Name",
        max_length = 255
    )

    author = models.ForeignKey(
        Author,
        on_delete=models.CASCADE
    )

    year = models.ForeignKey(
        Year,
        on_delete=models.CASCADE
    )

class Author(models.Model):
    name = models.CharField(
        verbose_name = "Author's Name",
        max_length = 255
    )

    num = models.CharField(
        max_length = 255,
        default=0
    )

例如,如果我过了2018年,我想检索所有在2018年出版书籍的作者。 我尝试了类似Year.objects.filter(year=2018).filter()

的其他查询

,不知道如何过滤其余部分

2 个答案:

答案 0 :(得分:2)

您可以使用双下划线('__')来过滤相关模型的内容,因此可以过滤{{}的year关系的year属性Book中的1}}:

Author

Author.objects.filter(book__year__year='2018').distinct()很有用,因为否则在2018年出版多本书的.distinct()会在查询集中出现多次次。

话虽这么说,在这里构造Author对象似乎很奇怪,而使其成为Year则更加奇怪(因为按CharField进行排序将导致*按字典顺序进行排序) 。 year模型中的num字段也可能也应该是IntegerField [Django-doc]

更好的建模方法可能是:

Author

在这种情况下,我们可以查询class Book(models.Model): name = models.CharField( verbose_name = "Library Name", max_length = 255 ) author = models.ForeignKey( Author, on_delete=models.CASCADE ) year = models.IntegerField() class Author(models.Model): name = models.CharField( verbose_name = "Author's Name", max_length = 255 ) num = models.IntegerField(default=0)位在2018年出版了一本书的用户,

Author

但是,目前尚不清楚Author.objects.filter(book__year=2018).distinct()在这里做什么。如果它可以容纳书籍数量,那么使用num可能是更好的选择,因为它可以避免数据重复。

答案 1 :(得分:1)

我可以看到年份是 CharField ,因此您必须使用引号进行查询,并且必须使用查找(function start(){ var fst = document.getElementById("fst").innerHTML = Math.floor(Math.random()*10); var snd = document.getElementById("snd").innerHTML = Math.floor(Math.random()*10); return fst+snd; } var x = start() function validate(){ var txt = document.getElementById("txt").value; if(txt==x){ console.log('Correct Answer'); } else console.log('Wrong Answer'); start(); })来查询相关字段模型。

year__year