В моей базе данных есть следующая структура:
{
"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:
obj, _ = Tag.objects.get_or_create(name=tag)
calculadora.tags.add(obj)
calculadora.save()
return calculadora
-> У меня проблемы с созданием нового «тега» в create () method;
(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 не проверяет.
Может ли кто-нибудь помочь мне обойти эту ошибку? Я целыми днями пытаюсь это выяснить! : /
Спасибо большое !!!