Возможно, вы не включили связанную модель в свой API или неправильно настроили атрибут `lookup_field` для этого поля.
Я пытаюсь настроить поле поиска между двумя сущностями, но не могу исправить эту ошибку.
Я уже пробовал эти решения, но ни одно из них не помогло мне (Что я делаю неправильно?):
Django Rest Framework, неправильно настроено поле поиска
вот мой код Модели:
class Category(models.Model):
title = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=80, default='')
def __str__(self):
return self.title
class Option(models.Model):
title = models.CharField(max_length=80)
slug = models.SlugField(max_length=80, unique=True)
description = models.CharField(max_length=250)
price = models.DecimalField(max_digits=7, decimal_places=2)
category = models.ForeignKey(Category, related_name='options', on_delete=models.CASCADE)
photo = models.ImageField(upload_to='options', null=True)
class Meta:
ordering = ['title']
def __str__(self):
return self.title
Сериализаторы:
class CategorySerializer(serializers.HyperlinkedModelSerializer):
options = serializers.HyperlinkedRelatedField(many=True, view_name='option-detail', read_only=True)
class Meta:
model = Category
fields = ('url', 'slug', 'title', 'options')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field': 'slug'}
}
class OptionSerializer(serializers.HyperlinkedModelSerializer):
category = serializers.ReadOnlyField(source='category.title')
class Meta:
model = Option
fields = ('url', 'slug', 'title', 'description', 'price', 'category')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field': 'slug'},
'category': {'lookup_field': 'slug'}
}
Просмотров:
class CategoryViewSet(viewsets.ReadOnlyModelViewSet):
"""
Returns the Category list or the requested one
"""
queryset = Category.objects.all()
serializer_class = CategorySerializer
lookup_field = 'slug'
class OptionViewSet(viewsets.ReadOnlyModelViewSet):
"""
Returns the Option list or the requested one
"""
queryset = Option.objects.all()
serializer_class = OptionSerializer
lookup_field = 'slug'
Урлы:
router = DefaultRouter()
router.register(r'options', views.OptionViewSet)
router.register(r'categories', views.CategoryViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Это работает для модели Option. Когда я нажимаю url '[localhost]/options/', он правильно перечисляет варианты, а когда нажимаю '[localhost]/options/some-option-slug', он возвращает правильный вариант.
Но ничего из этого не работает для модели Category. При обращении к '[localhost]/categories/' выдает "Не удалось разрешить URL для гиперссылки, использующей имя представления "option-detail". Возможно, вы не включили связанную модель в свой API, или неправильно настроили атрибут lookup_field для этого поля.". При обращении к '[localhost]/categories/category-slug/' возвращается 404 Not Found.
Моя версия django - 4.0.1, а версия Django Rest Framework - 3.13.1
Определение атрибута lookup_field для опций в CategorySerializer решило проблему.
Вот класс CategorySerializer:
class CategorySerializer(serializers.HyperlinkedModelSerializer):
options = serializers.HyperlinkedRelatedField(
view_name='option-detail',
lookup_field = 'slug',
many=True,
read_only=True)
class Meta:
model = Category
fields = ('url', 'slug', 'title', 'options')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field': 'slug'}
}
Проблема заключалась в том, что CategorySerializer устанавливал явные опции HyperlinkedRelatedField и его lookup_field тоже должен быть настроен.
Не стесняйтесь редактировать этот ответ, чтобы добавить более глубокое объяснение.