Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django QuerySet,其中许多被传递给自定义序列化程序_Python_Django_Django Queryset_Manytomanyfield_Serialization - Fatal编程技术网

Python Django QuerySet,其中许多被传递给自定义序列化程序

Python Django QuerySet,其中许多被传递给自定义序列化程序,python,django,django-queryset,manytomanyfield,serialization,Python,Django,Django Queryset,Manytomanyfield,Serialization,我找遍了,但找不到好的例子 我有两个模型,其中一个有一个ManyToManyField。我试图通过ManyToManyField将一个需要信息的查询集传递给一个自定义序列化程序,并返回一个JSON响应 model.py class Company(models.Model): """Company in database.""" founded = models.DateField(null=True) name = models.CharField(max_lengt

我找遍了,但找不到好的例子

我有两个模型,其中一个有一个ManyToManyField。我试图通过ManyToManyField将一个需要信息的查询集传递给一个自定义序列化程序,并返回一个JSON响应

model.py

class Company(models.Model):
    """Company in database."""

    founded = models.DateField(null=True)
    name = models.CharField(max_length=60)
    series = models.CharField(max_length=10, null=True)
    valuation = models.DecimalField(max_digits=20, decimal_places=5, null=True)
    description = models.TextField(null=True)

    def __unicode__(self):
        """Return human-readable representation of company for debugging."""

        return '<{}>'.format(self.name)


class Metric(models.Model):
    """Metrics for companies."""

    name = models.CharField(max_length=30)
    end_date = models.DateField()
    start_date = models.DateField()
    company = models.ManyToManyField(Company)
    value = models.IntegerField()

    def __unicode__(self):
        """Return human-readable representation of metric for debugging."""

        return '<{}, {}>'.format(self.name, self.company)
class ClientAPI:

@classmethod
def _serialize(cls, objects):
    def create_company_map():
        return {c.id: c.name for c in Company.objects.all()}

    # Replace company ids with company names
    def map_company(obj, company_map):
        if 'company' in obj:
            obj['company'] = company_map[obj['company']]
        return obj

    company_map = create_company_map()
    raw = serializers.serialize('python', objects)
    res = [dict(map_company(obj['fields'], company_map)) for obj in raw]
    return res

@classmethod
def get_metrics(cls, request):
    all_metrics = Metric.objects.all().order_by('end_date')
    serialized_metrics = ClientAPI._serialize(all_metrics)

    return JsonResponse(serialized_metrics, safe=False, json_dumps_params=None)

@classmethod
def get_metrics_by_company(cls, request, company_name):
    metrics_by_company = Metric.objects.filter(company__name=company_name).order_by('end_date')
    serialized_metrics_by_company = ClientAPI._serialize(metrics_by_company)

    return JsonResponse(serialized_metrics_by_company, safe=False, json_dumps_params=None)
我无法更改序列化程序,因为我有其他依赖它的方法。当我运行此代码时,我得到:

TypeError:不可损坏的类型:“列表”

非常感谢您对我如何解决此问题的任何见解!以防万一,这是回溯

Traceback (most recent call last):
  File "/Users/jackiehuynh/anaconda/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jackiehuynh/anaconda/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jackiehuynh/Lytmus/question_1/client/views.py", line 167, in get_metrics
    serialized_metrics = ClientAPI._serialize(all_metrics)
  File "/Users/jackiehuynh/Lytmus/question_1/client/views.py", line 65, in _serialize
    res = [dict(map_company(obj['fields'], company_map)) for obj in raw]
  File "/Users/jackiehuynh/Lytmus/question_1/client/views.py", line 60, in map_company
    obj['company'] = company_map[obj['company']]
TypeError: unhashable type: 'list'

由于
company
是一个m2m字段,下面语句中的
obj['company']
似乎是一个列表:

obj['company'] = company_map[obj['company']]
并且,您试图通过将列表作为键传递,从
公司映射
dict中获取一些值,这会导致此错误

您可以使用列表理解从ID获取公司名称:

obj['company'] = [company_map.get(idx, None) for idx in obj['company']]
您也可以按照下面的说明进行详细解释,如果您愿意,您可以自己在shell中尝试:

In [1]: x = {'a': 1}

In [2]: x[[1, 2]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-1032576b46f9> in <module>()
----> 1 x[[1, 2]]

TypeError: unhashable type: 'list'
[1]中的
:x={'a':1}
在[2]中:x[[1,2]]
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 x[[1,2]]
TypeError:不可损坏的类型:“列表”

没关系,我可能问了个不好的问题。事实证明我想做的是使用外键,而不是很多外键。无论如何,谢谢你的帮助

我确实弄明白了那部分,但我有点困惑于如何解决它。有什么想法吗?我唯一不能更改的是序列化程序,但是views.py和model.py中的所有其他内容都是可变的。