📜  django 复合主键 - Python (1)

📅  最后修改于: 2023-12-03 15:00:27.012000             🧑  作者: Mango

Django复合主键

在Django ORM中,我们可以使用单一字段作为主键,也可以使用复合主键。本文将介绍如何使用Django ORM创建和处理复合主键。

创建带有复合主键的模型

首先,我们要在定义模型时使用 models.ForeignKey ,并将其设置为 primary_key=True。如下面的例子所示:

from django.db import models

class MyModel(models.Model):
    my_field1 = models.CharField(max_length=20)
    my_field2 = models.CharField(max_length=20)
    my_field3 = models.CharField(max_length=20)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['my_field1', 'my_field2'], name='my_fields_pk'),
        ]

在这个例子中,我们定义了一个名为MyModel 的模型,它拥有三个字段:my_field1my_field2my_field3。我们使用 UniqueConstraint 限制了 my_field1my_field2 字段的组合是唯一的,并将其设置为此模型的 主键 。

使用复合主键查询数据库

我们可以像平常一样使用 objects 进行查询,只不过我们需要传递多个值来匹配复合主键。如下所示:

MyModel.objects.get(my_field1='value1', my_field2='value2')

这将返回一个 MyModel 实例,对应于具有 my_field1=value1my_field2=value2 的复合主键的记录。

如果我们想使用 filter 函数在返回多个记录时,需要使用到 __in 运算符。如下所示:

MyModel.objects.filter(my_field1__in=['value1', 'value2'], my_field2__in=['value3', 'value4'])

这将返回一个 QuerySet,其中包含具有复合主键 my_field1 在 ['value1', 'value2'] 中,my_field2 在 ['value3', 'value4'] 中的记录。

更新和删除记录

我们可以按照平常的方法更新和删除记录。 如下所示:

MyModel.objects.filter(my_field1='value1', my_field2='value2').update(my_field3='new_value')

这将更新主键值为 my_field1=value1my_field2=value2 的记录,并将 my_field3 设置为 new_value

MyModel.objects.filter(my_field1='value1', my_field2='value2').delete()

这将删除主键为 my_field1=value1my_field2=value2 的记录。

结论

在Django中,使用复合主键是很简单的,只需要将想要合并的字段设置为 primary_key=True,即可将其共同转化为主键。之后的操作与普通模型无异。