Не удается найти команду 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

Вернуться на верх