Django-Rest框架:从URL param动态设置数据库

2024-05-13 04:14:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到正确的方法:

用户服务:

/api/<country>/users
/api/us/users

该服务应该使用与URL中的国家相对应的数据库。在

在设置.py公司名称:

^{pr2}$

要将ModelViewSet I中的数据库设置为:

class UserViewSet(viewsets.ModelViewSet):

    model = User
    serializer_class = UserSerializer

    def get_queryset(self):
        country = self.kwargs['country']
        return User.objects.using(country).all()

当我试着写帖子或推特时,问题就出现了。是否必须重写序列化程序的create()或save()方法?还有别的办法吗?在

非常感谢!在


Tags: 方法pyselfapi数据库url公司国家
2条回答

我认为这种功能的最佳位置是QuerySetModelManager。例如,DRF的默认序列化程序使用the default model's manager创建对象。不幸的是,QuerySet无法根据模型的字段轻松更改当前数据库(self.db),因此必须重写所有相关的方法。在

class UserQuerySet(models.QuerySet):
    def create(self, **kwargs):
        obj = self.model(**kwargs)
        self._for_write = True
        obj.save(force_insert=True, using=kwargs.get('country'))
        return obj

class User(models.Model):
    objects = UserQuerySet.as_manager()

谢谢你,亚历克斯!你的回答帮了我很多忙。为了完全解决问题,我必须这样做:

在视图.py在

class UserViewSet(viewsets.ModelViewSet):

    model = User
    serializer_class = UserSerializer

    def perform_create(self, serializer):        
        serializer.validated_data['country'] = self.kwargs.get('country')
        serializer.create(serializer.validated_data)

然后在模型.py公司名称:

^{pr2}$

问题就解决了!非常感谢。在

相关问题 更多 >