我的数据库中具有以下结构:
{
"name": "sum",
"formula": "a+b",
"date": "2020-01-17T19:02:24.143000Z",
"tags": [
"sum",
"test"
],
"latex": "a+b"
}
“ tags”是Table Calculator中具有ManyToManyField关系的字段。我使用了一个中间模型(TagLink),该模型指定了ManyToMany关系中涉及的计算器和标签模型的外键。
型号:
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:
if Tag.objects.filter(name=tag_).exists():
calculadora.tags.add(tag_)
else:
new_tag = calculadora.tags.create(name=tag_)
calculadora.tags.add(new_tag)
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
有人可以帮助我解决此错误吗?我漫长的一天试图找出答案! :/
非常感谢你!
您的代码说的是,如果我有一个现有标签与Calculator建立关系,则无需验证Tag
是否存在,您只需使用get_or_create
method即可获取一个现有Tag
或创建一个新的,您还尝试在string
模型关系中添加Calculator
,请记住,在您的情况下validated_data.pop('tags')
是list
的strings
,就像这样['erika']
def create(self, validated_data):
tags = validated_data.pop('tags')
calculadora = self.Meta.model.objects.create(**validated_data)
for tag in tags:
# return the Tag object model
obj, _ = Tag.objects.get_or_create(name=tag)
calculadora.tags.add(obj)
calculadora.save()
return calculadora
有用的学习人员:
add
method的更多信息>