在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动态地给他餐馆。
答案 0 :(得分:0)
尝试使用单个下划线。
def perform_create(self, serializer):
serializer.save(restaurant_uuid=self.request.data['uuid'])