python - django rest框架中的CRUD操作具有多对多字段关系
问题描述
我正在使用 django rest 框架来创建 REST API。我的模型包含一个多对多字段,我在序列化它时遇到了一些复杂问题。
模型.py
class CustomerMaster(models.Model):
customer_key = models.IntegerField(db_column='CUSTOMER_KEY', primary_key=True) # Field name made lowercase.
first_name = models.TextField(db_column='FIRST_NAME', blank=True, null=True) # Field name made lowercase.
last_name = models.TextField(db_column='LAST_NAME', blank=True, null=True) # Field name made lowercase.
email = models.CharField(db_column='EMAIL', max_length=255, blank=True, null=True) # Field name made lowercase.
gender = models.TextField(db_column='GENDER', blank=True, null=True) # Field name made lowercase.
dob = models.DateField(db_column='DOB', blank=True, null=True) # Field name made lowercase.
phone = models.CharField(db_column='PHONE', max_length=255, blank=True, null=True) # Field name made lowercase.
address = models.TextField(db_column='ADDRESS', blank=True, null=True) # Field name made lowercase.
...
class Meta:
managed = False
db_table = 'customer_master'
def __str__(self):
return self.first_name + self.last_name
class Segment(models.Model):
name = models.CharField(max_length=100)
folder = models.CharField(max_length=100)
selection = JSONField()
createdAt = models.DateTimeField(null=True)
updatedAt = models.DateTimeField(null=True)
createdBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
contact = models.ManyToManyField(CustomerMaster)
def __str__(self):
return self.name
序列化程序.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('pk', 'email', 'first_name', 'last_name',)
class CustomerEmailSerializer(serializers.ModelSerializer):
class Meta:
model = CustomerMaster
fields = ('email', )
class SegmentSerializer(serializers.ModelSerializer):
contact = CustomerEmailSerializer(many=True)
createdBy = UserSerializer(required=False)
class Meta:
model = Segment
fields = ('name', 'folder', 'selection', 'createdAt', 'updatedAt', 'createdBy', 'contact')
我的 GET 请求输出:
{
"name": "asgg",
"folder": "Ticketing",
"selection": "{\"qq\": \"ee\"}",
"createdAt": null,
"updatedAt": null,
"createdBy": null,
"contact": [
{
"email": "aakashnihalani26@gmail.com"
},
{
"email": "qwerty@gmail.com"
}
]
}
我希望我的输出是这样的:
{
"name": "asgg",
"folder": "Ticketing",
"selection": "{\"qq\": \"ee\"}",
"createdAt": null,
"updatedAt": null,
"createdBy": null,
"contact": [
"aakashnihalani26@gmail.com",
"qwerty@gmail.com"
]
}
我正在使用 python 3.7、django 2.2.11、django rest 框架 3.11.0
任何帮助,将不胜感激。提前致谢!
解决方案
您不需要嵌套的序列化程序。您可以使用SlugRelatedField
.
class SegmentSerializer(serializers.ModelSerializer):
contact = serializers.SlugRelatedField(many=True, read_only=True, slug_field='email')
createdBy = UserSerializer(required=False)
class Meta:
model = Segment
fields = ('name', 'folder', 'selection', 'createdAt', 'updatedAt', 'createdBy', 'contact')
推荐阅读
- javascript - 带有 CryptoJS 的 VueJS 哈希文件
- python - 在 ipywidgets 中使用交互?
- clang - 铿锵冰的奇怪重复模板模式(CRTP)
- oracle - 什么是用户 IO 等待事件,例如“单元单块物理读取”、“单元多块物理读取”、“直接路径读取”和“单元智能表扫描”
- python - pandas matplotlib x 轴仅每五个位置标记一次
- html - 输入从具有弹性基础自动的小容器中分离出来
- sql - 从 SQL 中的 URL 中提取整数 ID
- azure - Cosmos DB IN 子句通过 REST API
- react-admin - 是否可以在 react-admin 的“undoable={false}”设置的删除确认中控制“取消”按钮的路径?
- javascript - 谷歌脚本根据单元格值或日期范围添加多行