我应该使用ArrayField或ManyToManyField作为标记

时间:2017-06-06 06:18:25

标签: django postgresql django-models django-postgresql

我正在尝试为django中的postgres数据库添加标签,我找到了两个解决方案:

使用外键:

class Post(models.Model):
    tags = models.ManyToManyField('tags')
    ...

class Tag(models.Model):
    name = models.CharField(max_length=140)

使用数组字段:

from django.contrib.postgres.fields import ArrayField

class Post(models.Model):
    tags = ArrayField(models.CharField(max_length=140))
    ...

假设我不关心在我的代码中支持其他数据库后端,建议的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果您希望监控类标签(例如:标签数量,特定标签数量等),请选择第一个选项,因为您可以向模型添加更多字段,并为应用程序。

另一方面,如果您只是为了显示或最小化处理而想要它是一个数组列表,请选择该选项。

但是,如果您希望节省时间并为应用添加丰富功能,可以使用此

https://github.com/alex/django-taggit

初始化就这么简单:

from django.db import models

from taggit.managers import TaggableManager

class Food(models.Model):
# ... fields here

    tags = TaggableManager()

可以按以下方式使用:

>>> apple = Food.objects.create(name="apple")
>>> apple.tags.add("red", "green", "delicious") 
>>> apple.tags.all()
[<Tag: red>, <Tag: green>, <Tag: delicious>]

答案 1 :(得分:1)

如果使用数组字段,

如果您使用M2M字段,

  • 您可以更轻松地过滤这些相关值 默认情况下,这些字段会被推迟,如果需要,可以使用prefetch_related,如果只想加载这些值的子集,则可以使用prefetch_related。

  • 由于密钥和额外的id字段,数据库中的总存储量将略高于M2M。

  • 在这种情况下,由于密钥,连接的成本完全可以忽略不计。

话虽如此,上述答案不属于我。不久前,当我学习Django时,我偶然发现了这种困境。我在这个问题中找到了答案Django Postgres ArrayField vs One-to-Many relationship

希望你得到你想要的东西。