Skip to main content
 首页 » 编程设计

python之努力让 django_comments 与 Django REST Framework 一起工作

2024年08月26日31duanxz

我是第一次在一个项目中使用 Django REST Framework,我正在努力处理一个特定的部分。该项目是一个问题跟踪器类型的应用程序,它使用 django_comments 允许对问题发表评论。我现在正在它之上构建一个 API,以允许创建一个移动应用程序。

我创建了以下序列化器:

from django.contrib.auth.models import User 
from todolist.models import Project, Issue 
from rest_framework import serializers 
from django_comments.models import Comment 
 
class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = User 
        fields = ('id', 'email', 'first_name', 'last_name') 
 
 
class ProjectSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = Project 
        fields = ('name', 'description', 'owner') 
 
 
class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = Comment 
 
 
class IssueSerializer(serializers.HyperlinkedModelSerializer): 
    comments = CommentSerializer(many=True) 
 
    class Meta: 
        model = Issue 

这是我的项目范围 urls.py,我在其中定义了路由:

from django.conf.urls import patterns, include, url  
from todolist.views import HomeTemplateView, UserViewSet, ProjectViewSet, IssueViewSet, CommentViewSet 
from rest_framework import routers 
from rest_framework.authtoken.views import obtain_auth_token 
 
# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 
 
router = routers.DefaultRouter() 
router.register(r'users', UserViewSet) 
router.register(r'projects', ProjectViewSet) 
router.register(r'issues', IssueViewSet) 
router.register(r'comments', CommentViewSet) 
 
urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'projectile.views.home', name='home'), 
    # url(r'^projectile/', include('projectile.foo.urls')), 
 
    # Uncomment the admin/doc line below to enable admin documentation: 
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
 
    # Uncomment the next line to enable the admin: 
    url(r'^admin/', include(admin.site.urls)), 
 
    # Comments 
    (r'^comments/', include('django_comments.urls')), 
 
    # Login 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 
 
    # Logout 
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login', {'login_url': '/accounts/login/'}), 
 
    # To-do list 
    url(r'^projects/', include('todolist.urls')), 
 
    # Home page 
    url(r'^$', HomeTemplateView.as_view( 
        template_name="todolist/home.html", 
        )),  
 
    # Router URLs 
    url(r'^api/', include(router.urls)), 
 
    # REST framework auth URLs 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
    url(r'^api-token-auth/', obtain_auth_token), 
 
    # API docs 
    url(r'^docs/', include('rest_framework_swagger.urls')) 
) 

当我运行一个试图获取所有评论的测试时,我看到了以下错误:

ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "contenttype-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. 

此外,当我获取问题时,它不包含评论。

现在,这个错误在我看来是在获取评论时无法将评论与其父项相匹配。我有 experienced similar problems when using Tastypie in the past ,我不确定如何使用 DRF 解决它。

请您参考如下方法:

在您的 Comment 序列化程序中,明确指定评论实例字段并排除字段 contenttype。

class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
        model = Comment 
        fields = ('field_1','field_2','field_3') #here goes your comment fields and dont include contenttype field 

问题是 DRF 将尝试应用超链接来表示所有关系,而对于 contenttype 字段,您没有 View 或序列化程序,您也不需要它。