您可能没有在 API 中包含相关模型,或者在此字段上错误地配置了“lookup_field”属性
You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field
我正在尝试设置两个实体之间的查找字段,但我无法修复此错误。
我已经尝试过这些解决方案,但 none 对我有用(我做错了什么?):
Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name "user-detail"
这是我的代码
型号:
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'
urls:
router = DefaultRouter()
router.register(r'options', views.OptionViewSet)
router.register(r'categories', views.CategoryViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这适用于 Option 模型。当我点击“[localhost]/options/”url 时,它会正确列出选项,而当我点击“[localhost]/options/some-option-slug”时,它会 returns 正确的选项。
但其中 none 适用于类别模型。调用“[localhost]/categories/”返回“无法使用视图名称“option-detail”解析 URL 超链接关系。您可能未能在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field
属性。”。调用 '[localhost]/categories/category-slug/' returns 404 Not Found.
我的django版本是4.0.1,我的Django Rest Framework版本是3.13.1
编辑
正如@code-apprendice 所建议的,这里是 print('router') 的输出:
[, , , , , , , , , ]
DRF 正确生成了视图选项列表、选项详细信息、类别列表和类别详细信息
为 CategorySerializer 中的选项定义 lookup_field 属性解决了这个问题。
这是 CategorySerializer class:
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 也需要配置。
随时编辑此答案以添加更深入的解释。
我正在尝试设置两个实体之间的查找字段,但我无法修复此错误。
我已经尝试过这些解决方案,但 none 对我有用(我做错了什么?):
Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name "user-detail"
这是我的代码 型号:
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'
urls:
router = DefaultRouter()
router.register(r'options', views.OptionViewSet)
router.register(r'categories', views.CategoryViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这适用于 Option 模型。当我点击“[localhost]/options/”url 时,它会正确列出选项,而当我点击“[localhost]/options/some-option-slug”时,它会 returns 正确的选项。
但其中 none 适用于类别模型。调用“[localhost]/categories/”返回“无法使用视图名称“option-detail”解析 URL 超链接关系。您可能未能在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field
属性。”。调用 '[localhost]/categories/category-slug/' returns 404 Not Found.
我的django版本是4.0.1,我的Django Rest Framework版本是3.13.1
编辑
正如@code-apprendice 所建议的,这里是 print('router') 的输出:
[
DRF 正确生成了视图选项列表、选项详细信息、类别列表和类别详细信息
为 CategorySerializer 中的选项定义 lookup_field 属性解决了这个问题。
这是 CategorySerializer class:
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 也需要配置。
随时编辑此答案以添加更深入的解释。