【问题标题】:How to count Artist in ManyToMany Field in Django如何在Django的ManyToMany字段中计算艺术家
【发布时间】:2021-02-22 04:40:10
【问题描述】:

我想计算一个艺术家制作的视频数量,请告诉我哪里错了?

这是我在 admin.py 文件中的代码

class ArtistAdmin(admin.ModelAdmin):
    list_display = ['name', 'date_of_birth', 'artist_videos']
    def artist_videos(self, obj):
        count = 0
        for artistcount in Artist.objects.all():
            if artistcount.name == VideoList.artists:
                count = count + 1
        return count

她是我在 models.py 中的代码

class Artist(models.Model):
    name = models.CharField(max_length=200)
    date_of_birth = models.DateTimeField()

    def __str__(self):
        return self.name
class VideoList(models.Model):
    title = models.CharField(max_length=200)
    artists = models.ManyToManyField(Artist)

def __str__(self):
    return self.title

【问题讨论】:

    标签: python django model


    【解决方案1】:

    我认为您的问题很简单,就是您检查了错误的东西。在声明中:

        ...
        count = 0
        for artistcount in Artist.objects.all():
            if artistcount.name == VideoList.artists:
                count = count + 1
    

    您正在将 string 与 django queryset 进行比较。这将始终为 False

    您实际上在 obj 中收集了 Artist 对象,因此您可以使用:

    class ArtistAdmin(admin.ModelAdmin):
        list_display = ['name', 'date_of_birth', 'artist_videos']
        def artist_videos(self, obj): # <-- mind the obj parameter!
            return VideoList.objects.filter(artists__name=obj.name).count()
    

    通过这种方式,您可以使用实际的 Artist 对象过滤视频。

    请注意,我没有检查我的实际项目,所以我可能是错的:/

    祝你好运!

    [编辑] 用户@ruddra 发布了一个更好的答案。也请参考他的帖子!总而言之,最好的方法是使用 M2M 关系管理器:

        # previous code
        def artist_videos(self, obj):
            return obj.videolist_set.all().count()
    

    【讨论】:

    • 但是你给了我这个答案而不是@ruddra 和知识从一个人转移到另一个人的东西只会让你转移知识的人很重要
    【解决方案2】:

    请确保您已迁移您的艺术家模型。 通过运行以下命令进行检查。

    python manage.py makemigrations 'Your app name here'
    

    python manage.py migrate 
    

    经过这次尝试 在 admin.py 中导入以下模型

    import Artist
    import VideoList
    
        def artist_videos(self, obj):
            count = Artist.objects.filter(name=VideoList.artists.name).count()
            return count
    

    这样做并告诉我。

    【讨论】:

      【解决方案3】:

      你可以像这样进行反向查询:

      class ArtistAdmin(admin.ModelAdmin):
          # rest of the code
          def artist_videos(self, obj):
              return obj.videolist_set.all().count()
      

      更多信息请查看documentation

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        相关资源
        最近更新 更多