user_image
By  离子镀520    On   2020年4月21日 16:30

您好,博主。我想问一下就是做自定义超链接时。是不是不能使用drf的DefaultRouter()默认生成的路由,我看它默认生成的路由都是以pk为接收参数的。我现在按照这样配置并不能成功 extra_kwargs = { 'command': {'read_only': True}, 'url': {'lookup_url_kwarg': 'command', 'lookup_field': 'command','view_name': 'jd-detail'}, },现在只要加上lookup_url_kwarg或者lookup_field就会报错。 以下是我的models class Users(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=20, verbose_name='姓名') # auth_code = models.CharField(max_length=20, default=_Command(5), verbose_name="授权码") created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class Jd(models.Model): '''''' service_name = models.CharField(max_length=100, verbose_name="服务名称") Jd_host = models.CharField(max_length=20, verbose_name="服务器地址") Jd_port = models.IntegerField(default=51804, verbose_name="服务器端口") Jd_username = models.CharField(max_length=20, default='root', verbose_name="登陆账号") Jd_password = models.CharField(max_length=50, verbose_name="服务器密码") use_users = models.ForeignKey(Users, related_name='alis', db_column='users_id', on_delete=models.DO_NOTHING) command = models.CharField(max_length=20, default=_Command(10), verbose_name="口令") created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.command 以下是我的serializers class UsersSerializer(serializers.ModelSerializer): class Meta: model = Users fields = '__all__' # 表示所有字段 class JdSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Jd # 这里返回的是绝对的url # HyperlinkedModelSerializer 会自动生成一个 url 字段来表示超链接 # 我们希望 API 中包括这个字段,所以这里我们在 fields 加上 fields = ( 'url', 'service_name', 'jd_host', 'jd_port', 'jd_username', 'jd_password', 'use_users', 'command', 'created') # read_only_field = ('command',) # 反序列化时哪些字段不操作 extra_kwargs = { 'command': {'read_only': True}, 'url': {'lookup_url_kwarg': 'command', 'lookup_field': 'command','view_name': 'jd-detail'}, } 以下是我views: class JdViewSet(ModelViewSet): queryset = Jd.objects.all() serializer_class = JdSerializer 以下是url: router = DefaultRouter() router.register(r'users', views.UsersViewSet, basename='users') router.register(r'djs', views.JdViewSet, basename='jd') urlpatterns = router.urls 以上是我的内容,希望您能在百忙之中解答一下,谢谢了