ForeignKey / OneToOneField引用一组unique_together字段?

时间:2016-08-09 21:25:40

标签: django orm foreign-keys

我想在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时,是否有ForeignKeyunique_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)

...但我想知道是否有更合适的方式对此进行建模。

0 个答案:

没有答案