Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将输入标签添加到文章中,并创建新的标签记录(如果它';数据库中的不存在_Python_Django - Fatal编程技术网

Python 将输入标签添加到文章中,并创建新的标签记录(如果它';数据库中的不存在

Python 将输入标签添加到文章中,并创建新的标签记录(如果它';数据库中的不存在,python,django,Python,Django,我有多对多关系的Tag和Article数据模型 class Tag(models.Model): owner = models.ForeignKey(User,on_delete=models.CASCADE) name = models.CharField(max_length=100) def __str__(self): return self.name class Meta: ordering = ("id",) clas

我有多对多关系的
Tag
Article
数据模型

class Tag(models.Model):
    owner = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name
    class Meta:
        ordering = ("id",)

class Article(models.Model):
    tags = models.ManyToManyField(Tag, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    ...
在接收表单输入的标签时,我首先检查标签是否存在,以确定是否在数据库中创建新标签,
然后将所有输入标记附加到文章中

#save the new article in database   
if article_form.is_valid():
    article = article_form.save(commit=False)
    article.owner = self.request.user
    article.save()
  • 创建记录中找不到的标记

    #compare tags
    input_tags = self.request.POST["tags"]
    input_tags = tags.split(",")
    query_tags = Tag.objects.all()
    #get name list of tab objects
    query_tags = [tag.name for tag in query_tags]
    #create new tabs in TabTable
    for tag in input_tags:
        if tag not in query_tags:
            Tag.objects.create(name=tag, owner=self.request.user)
    
  • 检索输入标记对象

    tag_objs = []
    for input_tag in input_tags:
        try:
            qualified_tab = Tab.object.filter(name=input_tag)[0]
            tag_objs.append(qualified_tab)
    
  • 将标签附加到文章

    article.tags.add(*tag_objs)
    
  • 这是一项常规任务,但解决方案很麻烦

    如何优雅地完成这样的任务?

    获取或创建(默认值=None,**kwargs)

    一种方便的方法,用于查找具有给定KWARG的对象(如果模型的所有字段都具有默认值,则可能为空),必要时创建一个KWARG

    返回一个元组(object,created),其中object是检索或创建的对象,created是一个布尔值,指定是否创建了新对象

    if article_form.is_valid():
        article = article_form.save(commit=False)
        article.owner = self.request.user
        article.save()
    
       # tag list
       input_tags = self.request.POST["tags"]
       input_tags = tags.split(",")
    
       #create new tabs in TabTable
       for tag in input_tags:
           tag, created = Tag.objects.get_or_created(
                               name=tag, 
                               defaults={"owner":self.request.user})
           tag.article_set.add(article)
           #article.tags.add(tag) test
    

    测试注释系统测试激活状态