python - Django REST Framework 序列化程序 - 访问现有的外键

标签 python django django-rest-framework foreign-keys

我正在使用 Django Rest Framework在我的应用程序中,我需要创建包含外键的新模型实例。这些引用另一个表中的现有对象,因此我不希望创建这些外来对象的新实例。此外,我无法通过主键访问这些对象,因为未提交该信息(我需要过滤 包含在 POST 请求中的某些字段)。

我该怎么做? This问题似乎解决了同样的问题,但我不清楚接受的答案是否真的解决了问题。假设我有两个模型,CategoryItem,后者的 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

关于python - Django REST Framework 序列化程序 - 访问现有的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47974094/

相关文章:

python - 创建标点符号免费列表?

python - XGBoost Python 错误 : "Size of labels must equal to number of rows"

python - Beam/Google Cloud 数据流 ReadFromPubsub 缺失数据

python - 如何在 GET 或 POST 中多次使用 Django 表单字段

django - 在运行时单元测试 Django Rest Framework 身份验证

python - Django REST 框架——如何将外键解析为实际值,而不是索引?

python - 如何循环 dict 并将该值用作对象的函数?

python - 如何在 django 中自定义 UserCreationForm 验证

python - 过滤数据并按编号排序显示结果。职位的

python - django rest framework 在列表显示中隐藏特定字段?