Django Rest-带有SlugRelatedField数据的ManyToManyField未创建

问题描述 投票:0回答:1

我的数据库中具有以下结构:

{
        "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

有人可以帮助我解决此错误吗?我漫长的一天试图找出答案! :/

非常感谢你!

django django-rest-framework many-to-many slug serializer
1个回答
0
投票

您的代码说的是,如果我有一个现有标签与Calculator建立关系,则无需验证Tag是否存在,您只需使用get_or_create method即可获取一个现有Tag或创建一个新的,您还尝试在string模型关系中添加Calculator,请记住,在您的情况下validated_data.pop('tags')liststrings,就像这样['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

有用的学习人员:

© www.soinside.com 2019 - 2024. All rights reserved.