【问题标题】:Django : defining method inside the modelsDjango:在模型中定义方法
【发布时间】:2020-03-12 10:01:27
【问题描述】:

serialize() 方法包含在 django Tools_booked 类中,但在尝试访问该方法时显示错误。

'QuerySet' object has no attribute 'serialize'

models.py

from django.core.serializers import serialize
class UpdateQuerySet(models.QuerySet):
    def serialize(self):
        print("*****Entered the serizlize inside the  UpdateQuerySet models **********")
        qs = self
        return serialize('json', qs, fields=('auto_increment_id','user','component','booked'))

class UpdateManager(models.Manager):
    def get_queryset(self):
        return UpdateQuerySet(self.model, using=self._db)

class Tools_booked(models.Model):
    auto_increment_id = models.AutoField(primary_key=True)
    user=models.ForeignKey(Profile, on_delete=models.CASCADE)
    component = models.CharField(max_length=30, blank=True)
    booked = models.DateTimeField(auto_now_add=True,blank=True)

    objects = UpdateManager()

    def __str__(self):
        return self.component

    def serialize(self):
        json_data = serialize("json", [self], fields=['auto_increment_id','user','component','booked'])
        stuct = json.loads(json_data)
        print(struct)
        data = json.dump(stuct[0]['fields'])
        return data

views.py

class SerializedDetialView(View):
     def get(self, request, *args, **kwargs):
        print("*****Entered the SerializedDetialView **********")
        obj_list= Tools_booked.objects.filter(auto_increment_id=1)
        json_data = obj_list.serialize()
        return HttpResponse(json_data, content_type='application/json')


class SerializedListView(View):
     def get(self, request, *args, **kwargs):
        json_data = Tools_booked.objects.all().serialize()
        return HttpResponse(json_data, content_type='application/json')

错误回溯

 json_data = Tools_booked.objects.all().serialize()
AttributeError: 'QuerySet' object has no attribute 'serialize'

但这行得通。

class SerializedDetialView(View):
     def get(self, request, *args, **kwargs):
        obj_list= Tools_booked.objects.filter(auto_increment_id=1)
        json_data = serializers.serialize("json", obj_list )
        return HttpResponse(json_data, content_type='application/json')


class SerializedListView(View):
     def get(self, request, *args, **kwargs):
        qs = Tools_booked.objects.all()
        json_data = serializers.serialize("json", qs )
        return HttpResponse(json_data, content_type='application/json')

如何在 models.py ,Tools_booked 类中使用 serialize() 方法。

【问题讨论】:

  • 使用super()方法
  • 请分享您的序列化代码
  • @Wariored 在哪里添加 super()
  • @abhikumar22 嘿,我正在学习 Django REST API,此时我的应用程序没有任何 serializers.py 代码。当前尝试使用模型内部定义的方法序列化对象查询。以前它在视图中使用。
  • @Wariored 和super() 有什么关系???

标签: django django-models django-rest-framework django-serializer


【解决方案1】:

您应该使用带有many=True 的Django-rest 框架序列化程序或使用Django 查询集的values() 函数。无需在模型中编写函数。它会像这样工作

class YourSerializer(serializers.ModelSerializer):
     class Meta:
        model = "You Model Here"
        fields = "write list of your model fields here or user __all__ for all fields"

你可以像这样序列化你的查询

queryset = Your_Model.objects.all()
serialized = YourSerializer(queryset, many=True).data

其他方法是这样的

serialized = Your_Model.objects.all().values()

这个方法看起来很简单,但是如果你在写rest api,你应该使用序列化器。您可以查看序列化程序here的详细信息。

【讨论】:

    【解决方案2】:

    这对我有用:

    from django.core.serializers import serialize
    from django.db import models
    
    
    class UpdateQuerySet(models.QuerySet):
        def serialize(self):
            print("*****Entered the serizlize inside the  UpdateQuerySet models **********")
            return serialize('json', self, fields=('component','booked'))
    
    class UpdateManager(models.Manager):
          # define here methods only needed inside this manager
           pass 
    
    class Tools_booked(models.Model):
        component = models.CharField(max_length=30, blank=True)
        booked = models.DateTimeField(auto_now_add=True,blank=True)
        objects = models.Manager()
        serializer = UpdateManager.from_queryset(UpdateQuerySet)()
    

    现在你可以在你的视图中做:

    json_data = Tools_booked.serializer.serialize()
    

    我猜你有一个错误,因为你的 serialize 方法没有在管理器内部定义

    【讨论】:

      【解决方案3】:

      在你的模型中

      class UpdateManager(models.Manager):
          def get_queryset(self):
              return UpdateQuerySet(self.model, self._db)
      
          # Here for you to call to your views
          def serialize(self):
              return self.get_queryset().serialize()
      

      在你看来

      json_data = Tools_booked.objects.all().serialize()
      

      Django 发生了一些变化。 这是 Django 更新版本的this document

      【讨论】:

        猜你喜欢
        • 2013-04-18
        • 2019-02-17
        • 1970-01-01
        • 2017-05-03
        • 2019-10-18
        • 2014-07-24
        • 2011-04-24
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多