首页 > 解决方案 > 如何使用 model.objects.values() 从模型“函数”中检索数据?

问题描述

这是我的模型

class ArtWork(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
   title = models.CharField(max_length=40)
   desc = models.TextField(max_length=100)
   image = models.ImageField(upload_to=get_post_filename, null=True, blank=True)
   category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.SET_NULL)
   album = models.OneToOneField('PostImages', related_name='model', 
                                        blank=True, null=True, on_delete=models.PROTECT)
   # identifier
   private_unique_id = models.CharField(max_length=200, blank=True, unique=True, default=uuid.uuid4)
   public_unique_id = models.CharField(max_length=200, blank=True, unique=True, default=uuid.uuid4)


   def __str__(self):
       return self.title

   def get_ratings(self):
       like = Vote.objects.filter(artwork=self, like=True, nope=False).count()
       nope = Vote.objects.filter(artwork=self, nope=True, like=False).count()

       return like, nope

我想在带有“值”过滤器的视图中获取 ArtWork 模型函数“get_ratings”

在views.py中

if request.is_ajax():
    posts = ArtWork.objects.filter(active=True)
    data = serializers.serialize("json", posts, fields=('image', 'title', 'desc','get_ratings'))
    return JsonResponse(data, content_type='application/json', safe=False)

posts = ArtWork.objects.filter(active=True).only('get_ratings').values('image', 'title', 'desc',)
return render(request, 'Home.html', {'posts': posts[:3]})

我想要做的基本上是在视图中为ajax请求返回一个对象列表,包括函数的结果

任何帮助表示赞赏,在此先感谢。

标签: djangodjango-models

解决方案


您应该使用自定义管理器将方法应用于 QuerySet。

class ArtWorkManager(models.Manager):
def get_ratings(self):
   like = Vote.objects.filter(artwork=self, like=True, nope=False).count()
   nope = Vote.objects.filter(artwork=self, nope=True, like=False).count()

   return like, nope

此外,您应该将以下行添加到 Artwork 模型:

objects = ArtWorkManager()

检查链接以获取自定义管理器。


推荐阅读