如何在django中将外键表示为一对?

bq8i3lrv  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(267)

以下是一些django模型:

class User (Model):
    name = CharField (max_length=100)

class ThingVersion (Model):
    timestamp = DateTimeField (auto_now_add = True)

class ThingPartition (Model):
    version          = ForeignKey (ThingVersion)
    partition_number = IntegerField ()

class UserInPartition (Model):
    user             = ForeignKey (User)
    version          = ForeignKey (ThingVersion)
    partition_number = IntegerField ()

    class Meta:
        unique_together = (('user', 'version'))

我故意不做“显而易见”的事,就是这样

class UserInPartition (Model):
    user      = ForeignKey (User)
    partition = ForeignKey (ThingPartition)

因为我需要 unique_together 约束,如果使用更规范化的 partition = ForeignKey (ThingPartition) 接近。
我该如何表达 UserInPartition.(version,partition_number) pair是 ThingPartition ?
或者,有没有一种方法可以使用 partition = ForeignKey (ThingPartition) 接近并约束 UserInPartition 模型只有一个 partition_number(user,version) ?

xwbd5t1u

xwbd5t1u1#

我试着理解你想要达到的目标,从而提供更好的答案。为什么在用户分区和thingpartition上都有分区号?
但你能做的是把分区变成多对多关系的直通模型。
https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.manytomanyfield.through
基本上,使用through模型可以完全满足您的需要-
有一个模型,在这个模型中,您指的是分区中的用户、分区号和版本
对该模型中的所有3个对象一起强制唯一
基本上,您的设置如下所示:

class User (Model):
    name = CharField (max_length=100)
    something_that_makes_sense = ManyToManyField(ThingVersion, through=ThingPartition)

class ThingVersion (Model):
    timestamp = DateTimeField (auto_now_add = True)

class ThingPartition (Model):
    user             = ForeignKey (User)
    version          = ForeignKey (ThingVersion)
    partition_number = IntegerField ()

    class Meta:
        unique_together = ('user', 'version', 'partition_number')

基于我有限的知识,那将是我最好的报价。

相关问题