【发布时间】:2020-05-04 20:14:08
【问题描述】:
我的数据库中有以下结构:
{
"name": "sum",
"formula": "a+b",
"date": "2020-01-17T19:02:24.143000Z",
"tags": [
"sum",
"test"
],
"latex": "a+b"
}
“tags” 是 Table Calculator 中具有 ManyToManyField 关系的字段。我使用了一个中间模型 (TagLink),它指定了计算器的外键和涉及多对多关系的标记模型。
型号:
class Tag(models.Model):
name = models.CharField(max_length=25, primary_key=True, db_column='sTag')
class Meta:
db_table = 'tTag'
class Calculator(models.Model):
name = models.CharField(max_length=100, primary_key=True, db_column='sName')
formula = models.CharField(max_length=200, db_column='sFormula')
date = models.DateTimeField(auto_now=True, db_column='dtModifiedDate')
tags = models.ManyToManyField(Tag, through='TagLink', through_fields=('calculator', 'tag'), related_name='calculator', symmetrical=False)
class Meta:
db_table = 'tCalculator'
class TagLink(models.Model):
calculator = models.ForeignKey(Calculator, on_delete=models.CASCADE, db_column='sCalculator')
tag = models.ForeignKey(Tag, on_delete=models.CASCADE, db_column='sTag')
class Meta:
db_table = 'tTagLink'
auto_created = True
unique_together = [['calculator', 'tag']]
这是序列化器:
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['name']
class CalculatorSerializer(serializers.ModelSerializer):
tags = serializers.SlugRelatedField(
many=True, queryset=Tag.objects.all(), slug_field='name')
class Meta:
model = Calculator
fields = ['name', 'formula', 'date', 'tags']
def create(self, validated_data):
tags = validated_data.pop('tags')
calculadora = self.Meta.model.objects.create(**validated_data)
for tag in tags:
obj, _ = Tag.objects.get_or_create(name=tag)
calculadora.tags.add(obj)
calculadora.save()
return calculadora
-> 我在 create() 方法中创建新“标签”时遇到问题;
(1)成功条件:如果标签已经存在于数据库(TagLink表)中,则创建成功:
(Pdb) calc_serializer.data
{'name': 't4', 'formula': 'r', 'date': '2020-01-17T18:54:18.448332Z', 'tags': ['erika'], 'inputs': [OrderedDict([('name', 'r'), ('calculatorName', 't4'), ('isCalculator', False), ('isArray', False), ('isMatrix', False)])]}
(2)失败条件:如果标签不存在于数据库中,则标签没有被创建,我得到以下错误“CalculatorNotFound”:
return CalculatorNotFoundException(logger, request_json['name']).response
Ps.:calc_serializer.data 正确返回。但是发生的事情是 calc_serializer 没有验证。
有人可以帮我解决这个错误吗?我花了很长时间试图找出答案! :/
非常感谢!!!
【问题讨论】:
标签: django django-rest-framework many-to-many slug serialization