我想在Django模型中为某个对象添加一些元数据。通常这对于OneToOneField甚至Multi-table inheritance来说都是一个很好的情况,但在我的情况下还有一个额外的特殊要求:
由于数据在整个系统中的同步方式,实际“目标”对象的数据库存储偶尔会被重新创建。也就是说,有时会删除所有对象行,并在其位置创建新对象行。但我需要保留元数据。
除了隐式主键外,每个对象还有一个文本段塞字段,用于唯一标识它 - 但在单个容器中只 。这个slug在重新创建的数据中是稳定的,容器本身也是如此。所以我想使用对象的slug和它的容器的组合来关联我的元数据,而不是对象的数据库主键。
我在to_field
模型字段中找到ForeignKey
选项,但如果我设置为to_field='id_in_container'
,则会抱怨,因为id_in_container
字段本身并不唯一,仅与container
字段一起使用。
有没有办法做这样的事情?
class Container(models.Model):
name = models.CharField(max_length=255)
class Object(models.Model):
container = models.ForeignKey(Container)
id_in_container = models.SlugField()
name = models.CharField(max_length=255)
class Meta:
unique_together = ('container', 'id_in_container')
# BUG: this won't actually work, `to_field` can't take a tuple!
DESIRED_COMBO = ('container','id_in_container')
class ObjectMetadata(models.model):
object = models. OneToOneField(Object, to_field=DESIRED_COMBO)
# … additional fields …
也就是说,当这些列为OneToOneField
时,是否有ForeignKey
或unique_together
定位目标模型的多个列?
我想我可以实现一些手动助手,也许是这样的:
class ObjectMetadata(models.model):
object_container = models.ForeignKey(Container)
object_slug = models.SlugField()
# … additional fields …
@classmethod
def get_for_object(cls, obj):
return cls.objects.get(object_container=obj.container, object_slug=obj.id_in_container)
...但我想知道是否有更合适的方式对此进行建模。