什么时候应该在Django查询中添加“_set”?

rhfm7lfc  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(121)

在下面的查询中,tweet的引用在prefetch中有一个“_set”,但在annotate中没有。在这两种情况下,从user到tweet的关系也是多对一的。

class User(models.Model)
    name = models.CharField(max_length=50)
    

class Tweet(models.Model)
    user = models.ForeignKey("User")
    favorite = models.IntegerField(default=0)

User.objects.prefetch_related(
    Prefetch(
        "tweet_set",
        query_set=Tweet.objects.order_by('favorite')
    ).annotate(most_favorites=Max("tweet__favorite")) # Why not "tweet_set__favorite"?
m2xkgtsf

m2xkgtsf1#

假设你有两个模型,Post和User。

class User(model.model):
    name = CharField()

class Post(model.model)
    title = CharField()
    author = ForeignKey(User, on_delete=models.CASCADE, null=True)

在这个一个(用户)对多个(帖子)的关系场景中,如果您想获取帖子的作者,只需通过post.author
相反,如果你想获取用户写的帖子,那么你应该在模型名称后添加_set作为入口点:my_articles = user.post_set.all()
顺便说一句,你也可以用related_name参数在ForeignKey构造函数中精确定义入口点字段名称,这取决于你的编码风格偏好:

class Post(model.model)
    title = CharField()
    author = ForeignKey(User, on_delete=models.CASCADE, null=True, related_name="articles")

# === code ===
my_articles = user.articles.all() 
# fetch with the name defined as related_name

参考:django文档

相关问题