Как объединить данные двух таблиц в JSON в Rest Framwork? - PullRequest
0 голосов
/ 25 июня 2018

Мои остальные сериализаторы фреймворков, как показано ниже:

class ResultSerializer(serializers.ModelSerializer):
    addline = serializers.JSONField();
    city = serializers.JSONField();
    unitcode = serializers.JSONField();
    maid = serializers.JSONField();

    class Meta:
        model = address
        fields = ('addline', 'city', 'unitcode', 'maid')

У меня есть две модели:

class address(models.Model):
    addline = models.CharField(max_length=120)
    city = models.CharField(max_length=120)
    unitcode = models.CharField(max_length=120)
    maid = models.CharField(primary_key=True)

class dep(models.Model):
    maid = models.CharField(primary_key=True)
    unit = models.CharField(max_length=120)

Это пример фильтра:

queryset = address.objects.filter(addline__icontains=‘110A Ave’)

Текущий ток данных, который я получаю:

       [ {
            "addline": "14075 110A Ave",
            "city": "Surrey",
            "unitcode": "U",
            "maid": 113091
        },
        {
            "addline": "14143 110A Ave",
            "city": "Surrey",
            "unitcode": "S",
            "maid": 113104,
      ]

Но то, что я хочу, это когда единичный код равен "U", там будет еще элемент: единица, как показано ниже:

       [ {
            "addline": "14075 110A Ave",
            "city": "Surrey",
            "unitcode": "U",
            "maid": 113091
        },
        {
            "addline": "14143 110A Ave",
            "city": "Surrey",
            "unitcode": "S",
            "maid": 113104,
            "unit": [ "A-101", "A-102", "A-103", "A-104"]
        }
      ]

Update2:

Основываясь на http://www.django -rest-framework.org / api-guide / Relations / # the-queryset-аргумент , мой текущий Models.py такой, как показано ниже:

class address(models.Model):
    addline = models.CharField(max_length=120)
    city = models.CharField(max_length=120)
    unitcode = models.CharField(max_length=120)
    maid = models.CharField(primary_key=True)

class dep(models.Model):
    maid = models.ForeignKey(address, related_name='tracks', 
                             on_delete=models.CASCADE)
    unit = models.CharField(max_length=120)

serializers.py как показано ниже:

class ResultSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)
    class Meta:
        model = address
        fields = ('addline', 'city', 'unitcode', 'tracks')

Но это не сработало, есть ли проблемы?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Я строю свои сериализаторы следующим образом, обращаю внимание на Глубину , относящуюся к вашему мета-классу, он контролирует, насколько глубину вы хотите достичь с вашими объединениями ... если вы установите 1 (по умолчанию), то онпринесет только идентификаторы объектов ... 2 он принесет объект, но если у вас есть объект внутри объекта, вы должны использовать 3 ...

from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):
    bar = serializers.PrimaryKeyRelatedField(queryset=Bar.objects.all())

    class Meta:
        model = Foo
        fields = ('bar',) 
        depth = 2 # this do the magic!

РЕДАКТИРОВАТЬ: Вы должны использоватьForeignKeys в вашем отношении ... но если вы не хотите делать это, переопределите ваш набор запросов класса и присоедините оба набора запросов

Вот один пример: https://teamtreehouse.com/community/django-rest-framework-override-get-queryset

EDIT2: Полагаю, вы можете настроить свои модели таким образом, у меня будет один istance для горничных , один для address , и вы можете использовать свой класс dep для установления отношений с ним

class Address(models.Model):
   ...

class Maid(models.Model):
   ...

class Dep(models.Model):
    maid = models.ForeignKey(Maid, unique)
    address = models.ForeignKey(Address)
    ...

И ваш сериализатор будет таким

class DepSerializer(serializers.ModelSerializer):
    maid = serializers.PrimaryKeyRelatedField(queryset=Maid.objects.all())
    address = serializers.PrimaryKeyRelatedField(queryset=Address.objects.all())

    class Meta:
        model = Dep
        fields = ('__all__') 
        depth = 2 # With 2 will bring full data from Maid and Address Table
0 голосов
/ 26 июня 2018

Это не стандартный подход (models.py):

 class Address(models.Model):
     addline = models.CharField(max_length=120)
     city = models.CharField(max_length=120)
     unitcode = models.CharField(max_length=120)
     maid = models.CharField(primary_key=True)

     @property
     def unit_json(self):
         dep = Dep.objects.get(maid=self)
         if dep:
            return dep.unit

     def as_json(self):
       return dict(
           addline=self.addline,
           city=self.city,
           unitcode=self.unitcode,
           maid=self.maid,
           unit=self.unit_json,
       )

Тогда

 queryset = address.objects.filter(addline__icontains=‘110A Ave’)
 queryset_json = [ob.as_json() for ob in queryset]
0 голосов
/ 25 июня 2018
class AddressSerializer(ModelSerializer):

  class Meta:
    model = Address
    fields = ['addline', 'city', 'unitcode', 'maid']

Теперь вы хотите добавить блок данных, их несколько.

Если две таблицы связаны через FK, вы можете посмотреть тему Связанные поля http://www.django -rest-framework.org/api-guide/relations/

или

Вы можете создать метод, подобный этому

class AddressSerilaizer(ModelSerilizer):
  units = SerilizerMethodField()

  def get_units(self, obj):
    return # your logic here

Кстати, форматирование немного, имя класса всегда CamelCase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...