我正在尝试为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))
...
假设我不关心在我的代码中支持其他数据库后端,建议的解决方案是什么?
答案 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)
如果使用数组字段,
数据库中每一行的大小都会有点大,因此Postgres会使用更多的toast表(http://www.postgresql.org/docs/9.5/static/storage-toast.html)
每次获得该行时,除非您专门使用延迟(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#defer)字段或以其他方式仅通过或者值或某物将其排除在查询之外,否则您需要支付所有这些费用每次遍历该行时的值。如果这就是你所需要的那么就是它。
根据该数组中的值进行过滤,虽然可能不会那么好,但Django ORM并不像M2M表那样明显。
如果您使用M2M字段,
您可以更轻松地过滤这些相关值 默认情况下,这些字段会被推迟,如果需要,可以使用prefetch_related,如果只想加载这些值的子集,则可以使用prefetch_related。
由于密钥和额外的id字段,数据库中的总存储量将略高于M2M。
在这种情况下,由于密钥,连接的成本完全可以忽略不计。
话虽如此,上述答案不属于我。不久前,当我学习Django时,我偶然发现了这种困境。我在这个问题中找到了答案Django Postgres ArrayField vs One-to-Many relationship。
希望你得到你想要的东西。