【发布时间】:2014-01-16 22:16:06
【问题描述】:
我的一些models 仅在keys 的组合中是唯一的。我不想使用auto-numberingid作为标识符,因为数据的子集将被导出到其他系统(例如spreadsheets),修改然后用于更新master database。
这是一个例子:
class Statement(models.Model):
supplier = models.ForeignKey(Supplier)
total = models.DecimalField("statement total", max_digits=10, decimal_places=2)
statement_date = models.DateField("statement date")
....
class Invoice(models.Model):
supplier = models.ForeignKey(Supplier)
amount = models.DecimalField("invoice total", max_digits=10, decimal_places=2)
invoice_date = models.DateField("date of invoice")
statement = models.ForeignKey(Statement, blank=True, null=True)
....
Invoice 记录仅对 supplier、amount 和 invoice_date 的组合是唯一的
我想知道是否应该基于supplier、amount 和invoice_date 为Invoice 创建一个slug,以便轻松识别正确的记录。
有多个related fields 来识别正确记录的问题的一个例子是django-csvimport,它假设只有一个相关字段并且在构建foreign key links 时不会区分两个。
然而,slug 似乎是一个笨拙的选项,在批量添加 records 后需要某种管理来重建 slugs。
我认为这一定是一个常见问题,也许某处存在最佳实践设计模式。
我正在使用PostgreSQL,以防有人有数据库解决方案。虽然如果可能的话我宁愿避免这种情况,但我可以看到它可能是构建我的slug 的方式,如果这是要走的路,也许是trigger functions。不过,这感觉有点像隐藏功能,并且可能会导致在不同的服务器上进行设置时令人头疼。
更新 - 阅读初始回复后
我的应用程序要求数据可以导出、远程修改,并在审核和批准后合并回主数据库。隐藏的自动编号键不容易始终如一地存活下来。如果statement 表被清空并从CSV 重新加载,则关系invoices[2417] is part of statements[265] 不是持久的。
如果我使用数字自动编号 pk,那么任何更新 database 的进程都需要刷新相关的键编号或使用多个 WITH 子句。
如果我创建了一个基于我的 3 个键但易于复制的 slug,那么我可以将它用作键 - 尽管很笨拙。我在想一个蛞蝓:
u'%s %s %s' % (self.supplier,
self.statement_date.strftime("%Y-%m-%d"),
self.total)
这似乎很笨拙,而且不是很 DRY,因为我希望我可能不得不在其他地方重新创建 slug 以复制算法(可能在 Excel 公式或 Access 查询中)
我认为一定有更好的方法我错过了,但看起来 yuvi 的回复意味着应该有,并且会有,但还没有:-(
【问题讨论】:
标签: django django-models foreign-keys