Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
如何通过外键Django序列化多对多?_Django_Django Models_Many To Many_Django Serializer - Fatal编程技术网

如何通过外键Django序列化多对多?

如何通过外键Django序列化多对多?,django,django-models,many-to-many,django-serializer,Django,Django Models,Many To Many,Django Serializer,我有型号“B”,通过外键多对多: class DManager(m.Manager): def get_by_natural_key(self, name): return self.get(name=name) class D(m.Model): objects = DManager() id = m.AutoField(primary_key=True) name = m.CharField(max_length=250, unique=

我有型号“B”,通过外键多对多:

class DManager(m.Manager):

    def get_by_natural_key(self, name):
        return self.get(name=name)


class D(m.Model):
    objects = DManager()
    id = m.AutoField(primary_key=True)
    name = m.CharField(max_length=250, unique=True, null=False)

    def natural_key(self):
        return (self.name)


class A(m.Model):
    id = m.IntegerField(unique=True, null=False, primary_key=True)
    name = m.CharField(max_length=250, null=True)


class B(m.Model):
    id = m.IntegerField(unique=True, null=False, primary_key=True)
    name = m.CharField(max_length=250, null=True)
    type = m.ForeignKey(D)
    bs = m.ManyToManyField(A, through='C')

    def natural_key(self):
        ## ?natural key for many-to-many?
        return(self.name, self.type.natural_key(), ?????)


class C(m.Model):
    a_id = m.ForeignKey(A)
    b_id = m.ForeignKey(B)
我可以通过外键(B-D)获取关系,但在我的ajax.py中无法获取多对多(B-A)的关系:

....
if request.is_ajax():
    aj_d = json.loads(request.body.decode('utf-8'))
    raw_data = serializers.serialize(
         'python', m.B.objects.filter(
          bs__a_id__in=aj_d['data']).distinct(),
    use_natural_foreign_keys=True)
    output = json.dumps(raw_data)
    return HttpResponse(output, content_type='application/json')
例如,可能通过values()存在另一种方式。但我对DICT的转储列表有问题——“JSON不可序列化”:

解决方案:

def push_data(request):

    q = m.B.objects

    if request.is_ajax():
        data = json.loads(request.body.decode('utf-8'))

    if 'req_1' in data:
        q = q.filter(bs__id__in=data['req_1'])

    if 'req_2' in data:
        q = q.filter(type__id__in=data['req_2'])

    actual_data = q.values('name', 'id', 'type__name')

    mtm_get(actual_data) ## down

    return HttpResponse(json.dumps(list(actual_data)),
                        content_type='application/json; charset=utf8')
对于多对多:

def mtm_get(data):
    for d in data:
        d['a_name'] = ', '.join(''.join(i) for i in m.B.objects.filter(
            pk=d['id']).values_list('bs__name'))
def mtm_get(data):
    for d in data:
        d['a_name'] = ', '.join(''.join(i) for i in m.B.objects.filter(
            pk=d['id']).values_list('bs__name'))