Django Rest Framework:使用双下划线调用serializer.save

时间:2018-02-21 09:28:37

标签: python django django-rest-framework django-queryset django-serializer

在Django中创建查询集时,可以使用双下划线方法来过滤模型的特定条件: 例如。而不是像他们的PK那样过滤餐馆:

restaurants = Restaurant.objects.filter(restaurant__uuid=<some_uuid>)

您可以通过模型的某些属性过滤它们,如下所示:

restaurants = Restaurant.objects.filter(restaurant__name=<some_name>)

或者

def get_queryset(self):
    restaurants = Restaurant.objects.filter(restaurant__uuid=self.kwargs['uuid'])
    return restaurants

现在在api中查看你的功能(例如在get_queryset中)你可以使用它来过滤请求的kwargs:

def perform_create(self, serializer):
    serializer.save(restaurant__uuid=self.request.data['uuid'])

现在我想使用serializer.save()做同样的事情。在我的表演中,我想打电话:

def perform_create(self, serializer):
    restaurant = Restaurant.objects.get(restaurant__uuid=self.kwargs['uuid'])
    serializer.save(restaurant=restaurant)

不幸的是,这会引发错误。我的解决方法是:

class Restaurant(models.Model):
    name = models.Charfield(max_length=255)
    uuid = models.UUIDField(
        default=uuid.uuid4,
        editable=False,
        unique=True
    )
    owner = models.ForeignkeyField(
        Owner,
        on_delete=models.CASCADE
    )

class Chef(models.Model):
    restaurant = models.ForeignKey(
        Restaurant,
        on_delete=models.CASCADE
    )
    training = models.Charfield(max_length=255)

但这显然性能不佳,因为它需要执行额外的查询集。 有没有办法让它在serializer.save()中一步完成?

非常感谢任何帮助!

编辑: 根据要求,我添加了餐厅模型:

{{1}}

只是为了澄清我想为Chef调用serializer.save(),根据UUID动态地给他餐馆。

1 个答案:

答案 0 :(得分:0)

尝试使用单个下划线。

def perform_create(self, serializer):
    serializer.save(restaurant_uuid=self.request.data['uuid'])