【发布时间】:2019-12-18 09:36:04
【问题描述】:
我尝试做大厅预订应用程序。我已经设置了所有东西。模型和序列化器视图集和 url。现在我想从这个 API 返回 1. 所有大厅都有他们的预订表 2. 所有用户都用大厅名称预订
我尝试使用 SerializerMethodField 来获取所有这些数据,并且它在一边工作。例如,当我将 SerializerMethodField 放在预订表中时,我会像大厅表一样给我结果。但是当我尝试同时放入这两个类时,它会给出错误maximum recursion depth exceeded
模型类
class HallModel(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='hall_owner')
name = models.CharField(max_length=100)
price = models.FloatField()
phone = models.CharField(max_length=9, blank=True)
size = models.CharField(max_length=50)
region = models.CharField(max_length=100)
state = models.CharField(max_length=100)
image_1 = models.ImageField(upload_to='halls_image')
image_2 = models.ImageField(upload_to='halls_image')
image_3 = models.ImageField(upload_to='halls_image')
created_at = models.DateTimeField(auto_now_add=True)
class BookingModel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_booking')
hall = models.ForeignKey(HallModel, on_delete=models.CASCADE, related_name='hall_owner')
time_date = models.DateTimeField(auto_now_add=True)
booking_method = models.IntegerField()
序列化器
class HallSerializer(serializers.ModelSerializer):
booking = serializers.SerializerMethodField()
class Meta:
model = HallModel
fields = '__all__'
def get_booking(self, obj):
booking = BookingSerializer(obj.hall_owner.all(),many=True).data
return booking
def perform_create(self, serializer):
serializer.save()
class BookingSerializer(serializers.ModelSerializer):
hall = serializers.SerializerMethodField()
class Meta:
model = BookingModel
fields = '__all__'
def get_hall(self, obj):
serializer_data = HallSerializer(obj.hall).data
return serializer_data
视图集
class HallViewSet(viewsets.ModelViewSet):
queryset = HallModel.objects.all()
serializer_class = HallSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class BookingViewSet(viewsets.ModelViewSet):
serializer_class = BookingSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def get_queryset(self):
return self.request.user.user_booking.all()
当我删除一个 SerializerMethodField 时,在 Serializer 类中它可以工作。任何人都有解决方案
【问题讨论】:
-
您需要在某处中断递归:在
get_booking、get_hall或两者中。一种选择是将context传递给序列化程序,表明您希望避免嵌套booking/hall,或者将字段减少到仅id。 -
你能解释一下吗
标签: django django-models django-rest-framework django-forms django-views