【问题标题】:Access many-to-many related to the same model访问同模型相关的多对多
【发布时间】:2014-11-14 05:22:06
【问题描述】:

我有一个包含以下模型的电影数据库。我将导演详细信息存储在 Actor 模型本身中。那就是我创建一个演员,然后将他链接为导演。通过这个我可以找到同时也是演员的导演。现在我的问题是列出所有董事。我无法编写查询。大多数时候我都会得到 ReverseManyRelatedObjectsDescriptor。

class Actor(models.Model):
    actorid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=250)
    sex = models.CharField(max_length=1)

    def director_list(self):
        directors = self.filter(actor__in=Movie.director).distinct()
                        **#ReverseManyRelatedObjectsDescriptor error**
        return directors


class Movie(models.Model):
    movieid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=250)
    actor = models.ManyToManyField(Actor, related_name="actor")
    director= models.ManyToManyField(Actor, related_name="director")

请帮忙,提前谢谢。

【问题讨论】:

  • 你要过滤掉什么?
  • 我想要所有导演的名单

标签: python django django-models many-to-many


【解决方案1】:

如果我能很好地理解您的问题,您需要那些担任导演的演员(没有特定的电影)。所以我所做的是创建一个 Actor 的类方法,如下所示:

class Actor(models.Model):
    actorid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=250)
    sex = models.CharField(max_length=1)

    @classmethod
    def director_list(cls):

        directors_available  = set (
            d.actorid
            for movie in Movie.objects.filter(director__is_null = False)
            for d in movie.director.all()
        )
        actors_directors     = Actor.objects.filter(actorid__in = list(directors_available))

        return actors_directors

现在你可以得到所有像这样的演员的导演:

director_list = Actor.director_list()

【讨论】:

  • 它说 int() 参数必须是字符串或数字,而不是 'ManyRelatedManager'
  • 对不起。又出了点问题。 'QuerySet' 对象没有属性 'director_set'
  • 对不起@VyasRao 再试一次
  • 谢谢@xecgr。您的代码确实有效。请将 'for d in movie.director_set.all()' 更改为 for 'd in movie.director.all()' 以供将来参考。再次感谢!
猜你喜欢
  • 2020-05-20
  • 1970-01-01
  • 2014-07-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多