【问题标题】:How to make a field with urls of model-1 instances that are related to model-2 instance inside the serializer of model-2?如何在model-2的序列化器中使用与model-2实例相关的model-1实例的url创建一个字段?
【发布时间】:2022-06-25 20:31:23
【问题描述】:

我的模型 Dish 与模型 DishesType 具有 ForeignKey 关系:

class DishesType(models.Model):
    # some fields ...


class Dish(models.Model):
    # some fields ...
    type_of_food = models.ForeignKey(DishesType, on_delete=models.CASCADE)

当我执行 retrieve 方法来获取单个 DishesType 模型实例时,我还想显示与以下相关的所有 Dish 模型实例的 url当前 DishesType 实例。

例如 DishesType 实例 Pizza 有 3 个相关的 Dish 实例:Meet PizzaHawaiian PizzaCheese Pizza。因此,当我检索页面site.com/dishes-types/pizza 时,我想要进行下一个序列化:

{
    "name": "Pizza",
    "dishes_type_url": "site.com/dishes-types/pizza/",
    ...
    "dishes": {
        "Meet Pizza": "site.com/dishes/meet-pizza/",
        "Hawaiian Pizza": "site.com/dishes/hawaiian-pizza/",
        "Cheese Pizza": "locasite.comlhost/dishes/cheese-pizza/"
    }
},

我已经尝试通过下一种方法来做到这一点(替换元类):

class DishSerializer(ValidateNameMixin, HyperlinkedModelSerializer):
    """The serializer of the 'Dish' model"""
    dish_url = HyperlinkedIdentityField(view_name="dish-detail", lookup_field="name")


class SingleDishesTypeSerializer(ValidateNameMixin, HyperlinkedModelSerializer):
    """The serializer of the 'DishesType' model"""
    dishes_type_url = HyperlinkedIdentityField(view_name="dishes_type-detail", lookup_field="name")
    dishes = SerializerMethodField(source="get_dishes")

    @staticmethod
    def get_dishes(dish_type):
        all_current_dishes_type_dishes = Dish.objects.filter(type_of_food=dish_type)
        # Here I'm getting the error displayed below
        serializer = DishSerializer(all_current_dishes_type_dishes, many=True)

        ...

        return some_data

但我当然会遇到下一个错误:

'HyperlinkedIdentityField' requires the request in the serializer context. Add 'context={'request': request}' when instantiating the serializer.

显然我无法从序列化程序访问request 对象,那么我应该怎么做才能完成我的想法?

【问题讨论】:

  • 你在哪里使用request?您没有显示所有代码。
  • @DavidLu 你还需要什么代码? request 传递给视图的对象,如果我不直接从视图传递它,则无法在序列化程序的方法中访问它,这是解决我的问题的方法之一,但我认为这种方法不是最好的。

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


【解决方案1】:

我认为您在创建 DishSerializer 实例时需要传递 request

class SingleDishesTypeSerializer(ValidateNameMixin, HyperlinkedModelSerializer):
    ...

    @staticmethod
    def get_dishes(dish_type):
        ...
        serializer = DishSerializer(all_current_dishes_type_dishes, context={'request': self.context['request']}, many=True)

【讨论】:

  • 认真的吗?您设置的函数参数名称没有区别..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多