Django REST - URL связанной модели ForeignKey в метаданных (ОПЦИИ) - PullRequest
0 голосов
/ 28 мая 2018

Я ищу, как получить URL-адрес модели, связанной с ForeignKey, в метаданных (ОПЦИИ).

Модели:

Class Country(models.Model):
    pass

Class City(models.Model):
    country = ForeignKey(Country)

Желаю "choices_url "ниже может быть показано на ОПЦИИ:

Городской API (ОПЦИИ)

"actions": {
    "POST": {
        "country": {
            "type": "related",
            "required": true,
            "read_only": false,
            "label": "Country",
            "choices_url": "http://example.com/api/country/"

Спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Я проверил, это обратный URL-адрес от "view_name" и view_name поля "{basename} -detail".Переопределите SimpleMetadata с помощью следующего класса и установите класс метаданных по умолчанию в settings.py.Проблема была решена."Choices_url" отображается URL-адрес списка_

import re


def get_view_name(view_name: str, view_type: str) -> str:
    if view_type in ['list', 'detail']:
        return re.sub('(.*)-[^.]*', f'\\1-{view_type}', view_name)
    raise ValueError(
        f"Wrong view_type. It should be either 'list' or 'detail'. "
        f'<:param view_type>: {view_type}')

class RestMetadata(SimpleMetadata):    
    def get_field_info(self, field):
        field_info = super().get_field_info(field)
        if (not field_info.get('read_only') and
                hasattr(field, 'choices')):
            if isinstance(field, serializers.HyperlinkedRelatedField):
                view_name = get_view_name(field.view_name, 'list')
                field_info['choices_url'] = field.reverse(view_name, request=field.parent.context['request'])
            elif (
                    isinstance(field, serializers.ManyRelatedField)
                    and isinstance(field.child_relation, serializers.ManyRelatedField)):
                field_child = field.child_relation
                view_name = get_view_name(field_child.view_name, 'list')
                field_info['choices_url'] = field_child.reverse(view_name, request=field.parent.context['request'])

        return field_info

{Project} /settings.py

REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': '{Path-of-RestMetadata}.RestMetadata'
}

Спасибо.

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