如何在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
相关产品推荐
相关产品推荐

