Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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 避免Django应用程序中的循环模型导入_Python_Django_Organization_Circular Reference_Contenttype - Fatal编程技术网

Python 避免Django应用程序中的循环模型导入

Python 避免Django应用程序中的循环模型导入,python,django,organization,circular-reference,contenttype,Python,Django,Organization,Circular Reference,Contenttype,我有一个django项目,其中有两个应用程序,如下所示: ## tags app, models.py class Tag(models.Model): title = models.CharField(max_length=50) ## items app, models.py from application.tags.models import Tag class Item(models.Model): title = models.CharField(max_len

我有一个django项目,其中有两个应用程序,如下所示:

## tags app, models.py
class Tag(models.Model):
    title = models.CharField(max_length=50)


## items app, models.py
from application.tags.models import Tag

class Item(models.Model):
    title = models.CharField(max_length=300)
    tags = models.ManyToManyField(Tag, related_name="items")
更新以澄清功能位置

我在
items.models
中的另一个模型上有一个方法,它获取所有具有一组标记的项目

结果查询如下所示:

## Gets all of the items that have tags t1 and t2
Item.objects.filter(tags=t1).filter(tags=t2)
此方法使用
项目
模型以及
标记
模型,这是可以的,因为标记已导入到项目应用程序中

但是,我想在tags应用程序中访问此方法,但这样做会导致循环导入

现在,我在tags应用程序中获取带有一组标记的所有项目的解决方法是在多对多字段中的反向关系上进行一组交集

## Get all items that have the tags with ids tag_ids
item_set = set(Tag.objects.get(pk=tag_ids[0]).items.all())
for cur_tag_id in tag_ids[1:]: ## for all of the rest of the tags
     item_set = item_set & set(Tag.objects.get(pk=cur_tag_id).items.all())
这将导致多个查询和一组交集。有没有一种方法可以从标签应用程序中的标签模型执行类似于
Item.objects.filter(tags=t1)、filter(tags=t2)…
的操作


我可以使用
contenttypes
绕过这个问题,以获得
Item
模型来进行相同的查询。这是否可以接受,或者是否有更好的方法来组织此代码?

使用外键定义模型时,可以使用以下格式:

tags = models.ManyToManyField('tags.Tag', ...)
这意味着您不需要导入Tag类,只需安装tags应用程序即可


然后,您可以将函数存储在不同的位置,这样就可以同时导入标记和项,而不必担心循环导入。

您还没有真正给出所有相关信息。您的筛选方法在哪里定义?为什么你不能把它放在一个可以被两个应用程序导入的地方呢?这就是我试图解决的问题。它是items应用程序中不同模型上的方法。问题是items.models导入标记,如果此方法位于其他位置,则仍需要导入项和标记。然后标签无法导入它,或者它仍然是循环的。谢谢。这会有所帮助,但问题是,如果我想从两个应用程序的模型中的不同位置使用该函数,那么我仍然会得到循环导入。您可以使用django.db.models.get_model('app.model')来获取对模型的引用,而不必导入它。有帮助吗?有帮助!我需要做get_model('app','model'),但这很有效。以这种方式检索模型是一种不好的做法吗?添加文档作为参考,该文档称为递归关系:Erm。我不确定这是否是一个递归关系。它指向一个不同的模型。