Python 3.x 如何查询Django模型(表)并从另一个模型(表)添加两个相关字段注释-左外连接

Python 3.x 如何查询Django模型(表)并从另一个模型(表)添加两个相关字段注释-左外连接,python-3.x,django,Python 3.x,Django,我想从电影模型(表)中获得一个特定的行(对象),并添加最大分级和发布最大分级的用户。像这样: movie.id | movie.title | movie.description | movie.maximum|评级| movie.maximum|评级|用户 下面是我试过的代码。 不幸的是,我的查询返回的是get()方法无法处理的queryset 型号.py from django.contrib.auth.models import AbstractUser from django.db im

我想从电影模型(表)中获得一个特定的行(对象),并添加最大分级和发布最大分级的用户。像这样:

movie.id | movie.title | movie.description | movie.maximum|评级| movie.maximum|评级|用户

下面是我试过的代码。 不幸的是,我的查询返回的是get()方法无法处理的queryset

型号.py

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    pass
    
class Rating(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name="ratings")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="ratings")
    score = models.DecimalField(decimal_places=2, max_digits=9)
    
class Movie(models.Model):
    title = models.CharField(max_length=64)
    description = models.TextField(max_length=4096)
from django.http import HttpResponse
from django.shortcuts import render
from .models import User, Movie, Rating
from django.db.models import Max, F

def index(request, movie_id):
    movie = Movie.objects.all().annotate(
        maximum_rating=Max('ratings__score'), 
        maximum_rating_user=F('ratings__user')
        ).get(pk=movie_id)
    return HttpResponse(movie)
视图.py

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    pass
    
class Rating(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, related_name="ratings")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="ratings")
    score = models.DecimalField(decimal_places=2, max_digits=9)
    
class Movie(models.Model):
    title = models.CharField(max_length=64)
    description = models.TextField(max_length=4096)
from django.http import HttpResponse
from django.shortcuts import render
from .models import User, Movie, Rating
from django.db.models import Max, F

def index(request, movie_id):
    movie = Movie.objects.all().annotate(
        maximum_rating=Max('ratings__score'), 
        maximum_rating_user=F('ratings__user')
        ).get(pk=movie_id)
    return HttpResponse(movie)
有谁能告诉我如何进行适当的查询,以便我可以从收视率模型中使用两个添加字段获得一部特定的电影(对象/行)

------编辑------------

当我运行以下代码时,控制台中会打印以下内容:

def index(request, movie_id):
    movies = Movie.objects.all().annotate(
            maximum_rating=Max('ratings__score'), 
            maximum_rating_user=F('ratings__user')
            )
    for movie in movies:
        print(movie.id, movie.title, movie.description, movie.maximum_rating, movie.maximum_rating_user)
    return HttpResponse("")
身份证件 标题 描述 评级 用户 1. 跳猫 狂野 2. 1. 1. 跳猫 狂野 1. 2. 1. 跳猫 狂野 5. 3. 1. 跳猫 狂野 4. 4. 2. 终结者 我会回来的! 8. 1. 2. 终结者 我会回来的! 6. 2. 2. 终结者 我会回来的! 4. 3. 2. 终结者 我会回来的! 10 4. 3. 小飞象 沃尔特·迪斯尼 6. 1. 3. 小飞象 沃尔特·迪斯尼 8. 2. 3. 小飞象 沃尔特·迪斯尼 9 3. 3. 小飞象 沃尔特·迪斯尼 2. 4. 4. 细红线 瓦特斯 9 1. 4. 细红线 瓦特斯 2. 2. 4. 细红线 瓦特斯 5. 3. 4. 细红线 瓦特斯 8. 4.
简单胜于复杂

def索引(请求,电影id):
rating=rating.objects.filter(movie_id=movie_id).order_by('-score').first()
返回HttpResponse(额定值)
此解决方案的问题是两个用户可能添加了相同的最大值,这就是您不应该也不能使用
get
方法的原因

如果需要从模板访问电影或用户对象,则必须:

{{rating.user.get_full_name}
{{rating.movie.title}
{{rating.score}

您可以通过分级模式获得特定电影的最高分级

def index(request, movie_id):
    movie = Rating.objects.filter(movie_id=movie_id).order_by('-rating')
    return HttpResponse(movie.first())

你能在这个问题中打印电影吗?
movie=movie.objects.all()
并告诉我结果我认为在
评分中有一个问题应该是
评分。评分
评分相同的用户应该是
评分。用户
因为您不是从评分模型中查询的,而是从电影模型中查询的。。。不确定这是否能解决你的问题是的,你的建议似乎提供了一个解决方案。然而,我确实很难理解返回对象的结构(thid是由Django自动生成的吗?)。另外,您示例中的
movie\u id=movie\u id
对我不起作用。我必须首先通过
movie=movie.objects.get(pk=movie\u id)
获取特定的movie对象,然后像so
movie=movie
一样传递到查询中。我是不是订的太多了?