You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中设置字段同时作为外键与主键的实现方法

Django实现字段同时作为主键和外键

在Django中,只需在外键字段上添加primary_key=True参数,就能让该字段同时承担主键和外键的角色,以下是具体实现示例:

一对一关联场景(最常见)

假设你有一张用户表User,需要创建一张用户信息表Profile,让Profile的关联字段同时作为自身主键和指向User的外键:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(unique=True)
    # 其他业务字段...

class Profile(models.Model):
    # 该字段同时是Profile的主键和指向User的外键
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
        related_name='user_profile'
    )
    bio = models.TextField(blank=True, verbose_name='个人简介')
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    # 其他信息字段...

一对多关联场景(需确保外键关联字段唯一)

如果需要用普通外键字段做主键,要保证关联的目标字段是唯一的(因为主键必须唯一),示例如下:

class Order(models.Model):
    order_no = models.CharField(max_length=30, unique=True, verbose_name='订单号')
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    # 其他订单字段...

class OrderDetail(models.Model):
    # 用关联订单的字段作为自身主键,同时作为外键
    order = models.ForeignKey(
        Order,
        on_delete=models.CASCADE,
        primary_key=True,
        related_name='details'
    )
    product_name = models.CharField(max_length=100)
    quantity = models.IntegerField()
    # 其他明细字段...

关键说明

  • primary_key=True会自动隐含unique=True,无需额外重复设置
  • on_delete参数是必填项,根据业务需求选择合适的约束(如CASCADE、PROTECT、SET_NULL等)
  • 执行makemigrations和migrate命令后,数据库中对应的字段会被标记为主键,同时创建外键约束指向关联表的主键

内容的提问来源于stack exchange,提问作者Didem Durukan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:37:36