Django 从多个queryset序列化数据

Django 从多个queryset序列化数据,django,Django,python manage.py shell: class Food(models.Model): user = models.ForeignKey(User) name = models.CharField(max_length=199) tags = TaggableManager() class Box(models.Model): user = models.ForeignKey(User) food = models.ManyToManyFie

python manage.py shell:

class Food(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=199)
    tags = TaggableManager()

class Box(models.Model):
    user = models.ForeignKey(User)
    food = models.ManyToManyField(Food, blank=True, null=True)
    if field.rel.through._meta.auto_created:
AttributeError: 'NoneType' object has no attribute '_meta'
我需要JSON和所有的
myfood
。如何序列化此数据

我的尝试:

data=serializers.serialize(“json”,myfood)

但我有一个错误:

box = Box.objects.filter(id=1)
myfood = box.food.all()
完整示例:(python manage.py shell):

class Food(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=199)
    tags = TaggableManager()

class Box(models.Model):
    user = models.ForeignKey(User)
    food = models.ManyToManyField(Food, blank=True, null=True)
    if field.rel.through._meta.auto_created:
AttributeError: 'NoneType' object has no attribute '_meta'
来自django.core导入序列化程序的
>
>>>从app.models导入*
>>>box=box.objects.filter(id=1)
>>>myfood=box.food.all()
>>>data=serializers.serialize(“json”,myfood)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/user/Pulpit/x/local/lib/python2.7/site-packages/django/core/serializers/_-init___;.py”,第99行,序列化
s、 序列化(查询集,**选项)
文件“/home/user/Pulpit/x/local/lib/python2.7/site packages/django/core/serializers/base.py”,第58行,序列化
自处理m2m_字段(obj,字段)
文件“/home/user/Pulpit/x/local/lib/python2.7/site packages/django/core/serializers/python.py”,第65行,在handle_m2m_字段中
如果创建了field.rel.through.\u meta.auto\u:
AttributeError:“非类型”对象没有属性“\u meta”

问题源于django附带的序列化程序,特别是这个处理m2m字段的函数:

>>> from django.core import serializers
>>> from app.models import *
>>> box = Box.objects.filter(id=1)
>>> myfood = box.food.all()
>>> data = serializers.serialize("json", myfood)

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/user/Pulpit/x/local/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 99, in serialize
    s.serialize(queryset, **options)
  File "/home/user/Pulpit/x/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 58, in serialize
    self.handle_m2m_field(obj, field)
  File "/home/user/Pulpit/x/local/lib/python2.7/site-packages/django/core/serializers/python.py", line 65, in handle_m2m_field
    if field.rel.through._meta.auto_created:
AttributeError: 'NoneType' object has no attribute '_meta'
问题是,当它迭代对象的字段时,它也会找到TaggableManager(它是一个管理器),并将其视为字段。然后,行
field.rel.through.\u meta.auto\u created
会导致错误(因为它不是字段)。我可以想到两种可能的修复方法:

  • 构建自己的序列化程序

  • 应用打开django taggit managers.py并更改此行(在TaggableManager init函数内):

    为此:

    class TaggableManager(RelatedField, Field):
         def __init__(self, verbose_name=_("Tags"),
             help_text=_("A comma-separated list of tags."), through=None, blank=False):
             Field.__init__(self, verbose_name=verbose_name, help_text=help_text, blank=blank)
    

  • 这是一种黑客行为,但也许对你来说已经足够好了。对不起,我帮不了你了

    你的代码看起来不错。您何时以及如何看待该错误?在壳里面?当试图打印数据时?在runserver中?@yuvi在外壳中从
    print myfood
    得到的东西很奇怪,因为box是一个QuerySet对象(而不是box对象)。您可能应该执行
    box=box.objects.get(id=1)
    ,对吗?另外,我刚刚重新创建了整个程序,并且像您那样序列化数据时没有任何问题。@yuvi谢谢。我的模型示例在此不完整。我还有
    TaggableManager()
    。这里有一个同样的问题:我怎样才能解决它?@marcelosalloum这个答案是一年前发布的。从那时起,情况发生了很大变化。我建议您打开一个新问题,提供您的代码和相关详细信息,并提供此答案的链接,并指出此解决方案不起作用。也许修复程序太旧了,也许django taggit已经解决了旧问题,而您正面临一些新问题,也许您犯了一个简单的语法错误。我无法盲目地告诉你为什么它不适合你。