Не удается найти команду Django Shell для очистки записей из одной таблицы, если соответствующие записи НЕ существуют в другой таблице
Django / ORM
У меня есть две таблицы, и я пытаюсь очистить / найти все записи в одной таблице, где в соответствующей таблице нет ни одной записи.
Я использую Django Shell для тестирования, но не могу найти команду, чтобы сказать (на простом английском)...
Удалить/показать все записи в моей таблице фильмов, для которых нет оценок в таблице рейтингов
В таблице Movie (очевидно) есть поле id, а в таблице Rating есть соответствующее поле FK movie_id)
Таблицы следующие:
class Movie(models.Model):
imdbID = models.TextField(unique=True)
title = models.TextField()
year = models.TextField()
class Rating(models.Model):
movie = models.ForeignKey(Movie,on_delete=CASCADE)
user = models.ForeignKey(User,on_delete=CASCADE)
rating = models.IntegerField()
Несколько команд Django, которые я выполнил (чтобы попытаться приблизиться):
>>> Movie.objects.all() ;gives all movies
>>> Rating.objects.all() ;gives all ratings
>>> Rating.objects.filter(movie__year=2018) ;works
Но когда я пытаюсь копнуть глубже: (пытаясь запросить фильмы, где movie_id равен rating movie_id), я застреваю...
>>> Movie.objects.filter(movie_id=rating__movie)
Traceback (последний последний вызов): Файл "", строка 1, in NameError: имя 'rating__movie' не определено
>>> Movie.objects.filter(rating__movie=movie_id)
Traceback (последний последний вызов): File "", line 1, in NameError: имя 'movie_id' не определено
Мне очень нужно условие NOT "WHERE", но я не могу получить даже условие TRUE
Вы пытаетесь получить данные двух моделей, но для этого необходимо использовать related_name внешнего ключа 'relationship 'backward''. Вы можете установить в определении ваших моделей.
class Rating(models.Model):
movie = models.ForeignKey(Movie,on_delete=CASCADE, related_name='rating_movie')
user = models.ForeignKey(User,on_delete=CASCADE, related_name='rating_user')
Если вы этого не сделали, имя каждого будет namemodel_set.
Теперь, например, получить данные о первом фильме с рейтингом.
movie_rated_1 = Rating.objects.get(id=1)
movie = movie_rated_1.rating_movie.all()
Или если вам нужны названия всех фильмов с рейтингом выше 8:
mr_gt_8= Rating.objects.filter(rating__gt=8).values_list(rating_movie__title, flat=True)
Получил это от Кена на djangoproject.com, работает отлично... спасибо Кену ...размещено здесь для пользы будущих искателей.
Movie.objects.filter(rating__isnull=True) or
Movie.objects.filter(rating__isnull=True).delete()
/fj