11

我有一个 django 项目,其中包含 2 个这样的应用程序:

## 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)

此方法使用Item模型以及Tag模型,这没关系,因为标签被导入到项目应用程序中。

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

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

## 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)...从标签应用程序中的标签模型中执行类似的操作?

我能够通过contenttypesItem模型进行相同的查询来解决这个问题。这是可以接受的,还是有更好的方法来组织这段代码?

4

1 回答 1

26

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

tags = models.ManyToManyField('tags.Tag', ...)

这意味着您不需要导入 Tag 类,只需安装 tags 应用程序。

然后,您可以将函数存储在不同的位置,这可能会同时导入 Tag 和 Item,而不必担心循环导入。

于 2011-08-03T08:09:10.363 回答