【问题标题】:Designing without duplicate foreignkey references in Django在 Django 中设计没有重复的外键引用
【发布时间】:2026-02-14 03:00:01
【问题描述】:

我想创建一个费用跟踪应用程序,每个用户都可以在其中输入费用并将其分类到自己的类别中。这是我使用的模型定义:

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    user = models.ForeignKey(User, related_name="my_categories")
    name = models.CharField(max_length=50)

class Expense(models.Model):
    date = models.DateField()
    amount = models.IntegerField()
    description = models.TextField()
    category = models.ForeignKey(Category)
    user = models.ForeignKey(User)

每个类别都必须与一个用户相关联,以便我们可以在输入费用时显示每个用户自己的类别以供选择。出于类似的原因,每个费用记录都应该与一个用户相关联。但是在费用的定义中,我们有两个对用户模型的引用,一个直接通过“用户”字段,另一个通过具有用户参考的“类别”字段。

我认为像这样的多次引用是一件坏事。有没有更好的方法来模拟这个?我知道我们可以从类别参考中找到用户,但这似乎是一种迂回的方式。

【问题讨论】:

  • 你为什么认为这是一件坏事?
  • @Marcin,因为理论上这些引用中的 2 个可以指向 2 个不同的用户实例,除非数据得到正确验证
  • 是的,但是除了第六范式之外,还有一些不同的范式。只要您的应用程序逻辑合理,这不太可能成为问题。

标签: django django-models foreign-key-relationship database-schema database-normalization


【解决方案1】:

虽然您的数据库不是 100% 规范化的,但在您的情况下,我不认为第二个参考是多余的。 “费用”和“类别”都是定义明确的实体,属于用户。如果您稍后想要更改外键以允许空类别或 ManyToManyField,您会立即注意到两个用户字段都是必需的。当该列存在时,数据库和开发人员也更容易按用户查找。

【讨论】: