Использование функции аннотирования Django при обращении к другой модели? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть три модели: модель «Пользователь», «Фильм» и «Рейтинг»:

class User(models.Model):
    user_id = models.IntegerField(primary_key=True)

class Movie(models.Model):
    movie_id = models.IntegerField(primary_key=True)
    imdb_rating = models.FloatField(null=True)
    rt_rating = models.IntegerField(null=True)

class Rating(models.Model):
    rating_id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='ratings'
    )
    movie = models.ForeignKey(
        Movie,
        on_delete=models.CASCADE,
        related_name='ratings'
    )
    rating = models.FloatField()

Для рейтинга я хотел бы отметить, где у меня есть разница между Rating.rating и Movie.imdb_rating.

У меня также есть userRatings, который содержит только оценки пользователя с id = 1, чтобы упростить вещи.

Я пытался использовать

userRating.annotate(imdb_diff=Value('rating') - Value('movie__imdb_rating'))

Но я получаюошибка

django.core.exceptions.FieldError: Cannot resolve expression type, unknown output_field

Как мне получить правильную аннотацию.

1 Ответ

2 голосов
/ 11 апреля 2019

Не путайте Value (используется для литеральных значений) и F (используется для имен столбцов базы данных):

userRating.annotate(imdb_diff=F('rating')-F('movie__imdb_rating'))
...