0

たとえば、映画などのデータベースに特定のオブジェクトのジャンル情報を保存するために、models.py に次のモデルがあります。

class Genre(models.Model):
    objects = RandomManager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    content_type = models.ForeignKey(ContentType, limit_choices_to=referential_genre_models, on_delete=models.CASCADE, verbose_name=_("Content Type"))
    object_id = models.CharField(max_length=36, verbose_name=_("Object ID"))
    content_object = GenericForeignKey('content_type', 'object_id')
    name = models.CharField(verbose_name=_("Genre"), blank=True, null=True, editable=False, max_length=50)
    date_added = models.DateTimeField(auto_now_add=True, verbose_name=_("Date Added"))

私の映画モデルクラスには、2 つのモデルを相互に接続するための次のフィールドがあります。

genre_relation = GenericRelation(Genre, related_query_name='genre_relation')

私の views.py では、たとえば「コメディ」と「ファミリー」というジャンルの特定の映画についてクエリを実行したいのですが、結果が返されません。

movie_genre_assets = Movies.objects.get_queryset().filter(Q(genre_relation__name="Comedy") | Q(genre_relation__name="Family")).order_by('release_date')

することができます。ヘルプ?

4

1 に答える 1

0

GenericRelation ではなく、through tableを使用する必要があります。これは、Movie と Genre の両方への外部キーを持つ別個のモデルであり、各レコードが関係を形成します。

class Movie(models.Model):
    genre = models.ManyToManyField(through="MovieGenre")
    ...

class Genre(models.Model):
    ...

class MovieGenre(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)

次に、次の方法でジャンルに属する映画にアクセスできます。

movie.genre.all()

そして、ムーブに属するすべてのジャンル:

genre.movie_set.all()
于 2021-07-21T13:03:37.090 に答える