【问题标题】:Could not resolve URL for hyperlinked relationship using view name "post-detail"无法使用视图名称“post-detail”解析超链接关系的 URL
【发布时间】:2018-11-22 00:58:30
【问题描述】:

无法使用视图名称“post-detail”解析超链接关系的 URL。您可能没有在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。

Serializers.py

post_detail_url = HyperlinkedRelatedField(
view_name="posts-api:detail",
read_only=True,
lookup_field='slug'
)


class PostListSerializer(ModelSerializer):
class Meta:
    url = post_detail_url
    fields = (
        'id',
        'url',
        'user',
        'title',
        'content',
        'created_at',
        'updated_at',
    )
    model = Post

Urls.py

urlpatterns = [
url(r'^$', PostListAPIView.as_view(), name='list'),
url(r'^create/$', PostCreateAPIView.as_view(), name='create'),
url(r'^(?P<slug>[\w-]+)/$', PostDetailAPIView.as_view(), name='detail'),
url(r'^(?P<slug>[\w-]+)/edit/$', PostUpdateAPIView.as_view(), name='update'),
url(r'^(?P<slug>[\w-]+)/delete/$', PostDeleteAPIView.as_view(), name='delete'),  
]

后模型

class Post(models.Model):
user                = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, default=1)
title               = models.CharField(max_length=200)
content             = models.TextField()
posted              = models.DateField(db_index=True, auto_now_add=True)
slug                = models.SlugField(max_length=100, unique=True, blank=True)
created_at          = models.DateTimeField(auto_now_add=True)
updated_at          = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.title

【问题讨论】:

  • 你需要在json响应中获取当前帖子的url吗?
  • 我已经将反应设置作为我的前端来显示数据。到目前为止,我只是设置后端 rest-api 来查看 json 响应。所以是的,当前帖子将显示为 json 响应。
  • 可以添加post模型吗?
  • 添加了帖子模型。

标签: django django-models django-rest-framework django-views


【解决方案1】:

无法使用视图名称“posts-api:detail”解析超链接关系的 URL。您可能没有在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。

url = HyperlinkedIdentityField(view_name="posts-api:detail" ,read_only=True, lookup_field ='slug')

class Meta:
    model = Post
    fields = [
    'url',
    'user',
    'id',
    'title',
    'slug',
    'content',
    ]

【讨论】:

    【解决方案2】:

    序列化器的字段应该定义为序列化器属性,而不是元属性:

    class PostListSerializer(ModelSerializer):
        url = HyperlinkedRelatedField(
            view_name="posts-api:detail",
            read_only=True,
            lookup_field='slug'
        )
    
        class Meta:
            ...
    

    此外,如果您需要获取帖子的 url 而不是某些相关对象的 url,您应该使用 HyperlinkedIdentityField:

    class PostListSerializer(ModelSerializer):
        url = HyperlinkedIdentityField(
            view_name="posts-api:detail",
            read_only=True,
            lookup_field='slug'
        )
        class Meta:
            fields = (
                'id',
                'url',
                'user',
                'title',
                'content',
                'created_at',
                'updated_at',
            )
            model = Post
    

    【讨论】:

    • 成功了,谢谢!为什么必须将其定义为序列化程序属性?如果我想在另一个 SerializerModel 中声明相同的 url 怎么办,这意味着我必须在另一个序列化器中重新编写相同的代码?
    • @MichaelTeixeira 序列化程序将无法看到在meta 级别上声明的字段。为了减少复制粘贴,您可以编写简单的 mixin 类,其中定义了 url 字段,并将其用作序列化程序的基类:class PostListSerializer(UrlMixin, ModelSerializer):。在此处查看示例:stackoverflow.com/questions/28747487/…
    猜你喜欢
    • 2021-01-25
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多