django rest framework получает все связанные поля и фильтрует их во множество полей - PullRequest
0 голосов
/ 11 марта 2019

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

Вот мой код:

Models.py

class Store(models.Model):
    name = models.CharField(max_length=100)
​
​
class Contact(models.Model):
    id = models.CharField(primary_key=True, max_length=200)
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    email = models.CharField(max_length=100, null=True, blank=True)
    stores = models.ManyToManyField(Store, related_name='contacts')
​
​
class DataType(models.Model):
    datatype = models.CharField(max_length=10)


class DataField(models.Model):
    name = models.CharField(max_length=100)
    label = models.CharField(max_length=100)
    datatype = models.ForeignKey(
        'DataType',
        on_delete=models.SET_NULL,
        null=True
    )


class DataFieldValue(models.Model):
    contact = models.ForeignKey(
        Contact,
        on_delete=models.SET_NULL,
        related_name='datafieldvalues',
        null=True
    )
    datafield = models.ForeignKey(
        'DataField',
        on_delete=models.SET_NULL,
        null=True
    )
    value = models.CharField(
        max_length=250,
        null=True,
        blank=True
    )

Views.py

# Contact API views.
class ContactListAPIView(generics.ListAPIView):
    queryset = Contact.objects.all()
    serializer_class = ContactSerializer
    filter_class = ContactFilter

Фильтры.py

class ContactFilter(django_filters.rest_framework.FilterSet):
    store = django_filters.CharFilter()

    class Meta:
        model = Contact
        fields = ['store']

Serializers.py

class ContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = Contact
        fields = '__all__'

(Additionnal) Вот схема: схема

вот что я хочу:

GET / contacts /? Store = 54

{
    "count": 25,
    "next": "<url>/contacts/?page=3",
    "previous": "<url>/contacts/?page=2",
    "data": [
        {
            "id": "a519d2cd-13c6-48f3-b391-9a7e0cee58cc",
            "src_id": 356,
            "first_name": "Benjamin",
            "last_name": "Pavard",
            "email": "benjamin.pavard@email.fr",
            "datafields" : {
                "age" : "eighteen"
            },
            "store": 54
        },
        ....
    ]
}

но вот что я получил:

{
    "next": null,
    "previous": null,
    "count": 10,
    "data": [
        {
            "id": "1234567",
            "first_name": null,
            "last_name": null,
            "email": "cartouche@email.fr",
        },
        .....
}

Вопросы:

как я могу получить "поля данных"?«age» - это объект «datafield», а «восемнадцать» - объект datafieldvalue.

Как я могу получить только тот магазин, который я передал в параметре?

Большое спасибо заваша помощь, что бы это ни было.

1 Ответ

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

Вам необходимо добавить больше полей в ContactSerializer

class ContactSerializer(serializers.ModelSerializer):
    store = serializers.SerializerMethodField()
    datafields = serializers.SerializerMethodField()

    class Meta:
        model = Contact
        fields = '__all__'

    def get_datafields(self, obj):
        result = {}
        for data_field_value in obj.datafieldvalues.all().select_related('datafield'):
            result[data_field_value.datafield.label] = data_field_value.value
        return result

    def get_store(self, obj):
        request = self.context['request']
        store = request.query_params.get('store', '')
        return store
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...