You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django/Python中复制模型对象时仅保留非关联属性?

问题

需要将一个Django模型对象复制到另一个对象,但不想复制关联属性。示例模型如下:

class Dish(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=500)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name

目前执行的代码:

my_dish = Dish.objects.get(pk=dish.id)
serializer = Dish_Serializer(my_dish)
my_new_object = serializer.data

希望my_new_object仅包含非关联属性(如name和description),且不直接显式访问这些属性,该如何实现?

解决方案

方法一:自定义序列化器排除关联字段

直接在Dish_Serializer中配置字段规则,无需硬编码所有非关联字段:

from rest_framework import serializers
from .models import Dish

class Dish_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Dish
        # 排除关联字段category,若不需要id也可一并加入排除列表
        exclude = ['category']
        # 也可以显式指定要包含的字段,但后续新增非关联字段时需要同步更新
        # fields = ['name', 'description']

配置后,序列化得到的serializer.data就只会包含非关联属性,业务代码里不用直接指定字段名。

方法二:动态筛选模型的非关联字段

如果不想修改序列化器,可通过模型的_meta属性自动筛选非关联字段,构造目标对象:

from django.db import models

my_dish = Dish.objects.get(pk=dish.id)
# 筛选所有非关联字段:排除外键、一对一关联类型
non_related_fields = [
    field.name for field in my_dish._meta.fields
    if not isinstance(field, (models.ForeignKey, models.OneToOneField))
]
# 额外排除多对多关联字段(多对多字段不在_meta.fields中,需单独处理)
many_to_many_fields = [field.name for field in my_dish._meta.many_to_many]
non_related_fields = [f for f in non_related_fields if f not in many_to_many_fields]

# 构造仅含非关联属性的字典
my_new_object = {field: getattr(my_dish, field) for field in non_related_fields}

这种方式的优势是后续模型新增非关联字段时,无需修改这段代码,会自动纳入新字段。

内容的提问来源于stack exchange,提问作者Rafael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:50:23