Django REST Framework 序列化器 - 访问现有外键

2024-01-07

我在用Django 休息框架 http://www.django-rest-framework.org/api-guide/serializers在我的应用程序中,我需要创建包含外键的新模型实例。这些引用另一个表中的现有对象,因此我不希望创建这些外部对象的新实例。此外,我无法通过主键访问这些对象,因为该信息未提交(我需要过滤某些字段are包含在POST要求)。

我该怎么做呢?This https://stackoverflow.com/questions/42014287/serializer-with-foreign-key-get-and-post问题似乎解决了同样的问题,尽管我不清楚接受的答案是否真正解决了问题。假设我有两个模型,Category and Item,有一个ForeignKey后者中的字段指定类别:

class Category(models.Model):
    name = models.TextField()
    format = models.TextField()
    page = models.IntegerField(default=1)
    order = models.IntegerField(default=1)

class Item(models.Model):
    username = models.TextField()
    title = models.TextField()
    category = models.ForeignKey('Category', null=True)
    data = JSONField(null=True, blank=True)

的身体POST请求由 JSON 有效负载组成,类别定义为指定格式、页面和订单字段的对象:

POST /api/items
{
  "username" : "test",
  "title" : "foo",
  "category" : {
    "format" : "A",
    "page" : 2,
    "order" : 1
  },
  "data" : [1,2,3,4,5]
}

然后我想我可以定义我的Item序列化器如下,覆盖create以便它检索正确的Category通过过滤适当的字段并将其设置到返回的实例Item实例:

class ItemSerializer(serializers.ModelSerializer):
    category = CategorySerializer()
    data = serializers.ListField()

    class Meta:
        model = Item
        fields = ('username', 'title', 'category', 'data')

    def create(self, validated_data):
        category_dict = validated_data.pop('category')
        item = Item.objects.create(**validated_data)
        format = category_dict.format
        page = category_dict.page
        order = category_dict.order
        item.category = Category.objects.get(format=format, page=page, order=order)
        return item

这是正确的做法吗?


它会像

try:
    category = Category.objects.get(format=format, page=page, order=order)
except Category.DoesNotExist:
    # either make it None or create new category, depends on your requirement
    category = None
    # or create new category
except Category.MultipleObjectsReturned:
    category = category.first() # it depends on your requirement
item.category = category
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django REST Framework 序列化器 - 访问现有外键 的相关文章

随机推荐