Обратный внешний ключ набора запросов Django для ссылки JSON - PullRequest
0 голосов
/ 08 марта 2019

Я использую Python и Django Framework и у меня есть две таблицы с отношением внешнего ключа, и я хочу создать некоторый запрос, в котором результат включает в себя поля из второй таблицы с использованием внешнего ключа для экспорта, что приводит к некоторому API JSON.

Я хотел бы создать запрос в табличной работе, но в результатах я хотел бы добавить поля из возможностей таблицы на основе внешнего ключа

models.py

class work(models.Model):
    field_0 = models.CharField(max_length=100,blank=True, null=True)
    field_1=models.CharField(max_length=100,blank=True, null=True)



class abilities(models.Model):
    field_3 = models.CharField(max_length=100,blank=True, null=True)
    field_4=models.CharField(max_length=100,blank=True, null=True)
    field_5=models.CharField(max_length=254,blank=True, null=True)
    field_fk= models.ForeignKey('work', blank=True, null=True)

views.py

def work_json(request):
    work_se=serialize('json',work.objects.all())
    return HttpResponse(work_se,content_type='json')

json результат, где я беру с моего взгляда:

[
{
"model": "mymodel",
"pk": 1,
"fields": {
"field_0": "some value",
"field_1": "some value field 1",
}
}
……… next object
]

JSON результат, где мне нужно (с полями из таблицы, где есть field_fk 1)

[
{
"model": "mymodel",
"pk": 1,
"fields": {
"field_0": "some value",
"field_1": "some value field 1",

"field_3": "some value field 3",
"field_4": "some value field 4",
"field_5": "some value field 5",

}
……… next object
]

Есть идеи, как это сделать?

спасибо

Ответы [ 2 ]

0 голосов
/ 08 марта 2019
class ResourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Resource
        fields = '__all__'


class SiteSerializer(serializers.ModelSerializer):
    resources = ResourceSerializer(read_only=True, many=True) # resource is the foreign key in site

    class Meta:
        model = Site
        fields = '__all__'


def all_sites(request):
    sites = Site.objects.all()
    serialize = SiteSerializer(sites, many=True)

    main = {'status': True, 'msg': 'OK', 'sites': serialize.data}
    return HttpResponse(json.dumps(main), content_type='application/json')

Создайте сериализаторы моделей для обеих моделей, serialize.data в представлениях содержит словарь, к которому вы хотите обращаться как словарь, это то, что вы хотите?

0 голосов
/ 08 марта 2019

Плоское включение, как вы предлагали, будет работать только в том случае, если между двумя моделями будут взаимно-однозначные отношения.При наличии отношения «один ко многим» вам необходимо вложить Abilities объекты в ваши Work объекты (см. Соглашения об именах Python BTW). Django Rest Framework помогает в этом, давая вам что-то вроде этого:

{
    "id": 1,
    "field_0": "data in field_0",
    "abilities_set": {
        {
            "id": 1,
            "field_3": "data in field_3",
            "field_4": "data in field_4",
            "field_5": "data in field_5"
        },
        {
            "id": 2,
            "field_3": "data in field_3",
            "field_4": "data in field_4",
            "field_5": "data in field_5"
        }
    }
}
...