【问题标题】:Multiple references to the same model in another model in DjangoDjango中另一个模型中对同一模型的多次引用
【发布时间】:2011-09-19 07:16:02
【问题描述】:

您好,我的系统中有很多用户被分类为不同的类型。我想存储所有这些用户的地址详细信息。例如,用户可以是学生、学校或特许经营商。这里的所有用户都可以有一个与之关联的地址信息。

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

class Address(models.Model):
    user = models.OneToOneField(User)
    address = models.TextField()

class Student(models.Model):
    user_id = models.ForeignKey(User)
    address = models.ForeignKey(Address)

class School(models.Model):
    user_id = models.ForeignKey(User)
    address = models.ForeignKey(Address)
    contact_person_name = models.CharField(max_length=50)

在这种情况下,有两个对 User 模型的引用——一个通过 user_id,另一个通过 address.user,尽管它们应该引用同一个实例。重复引用是不好的做法吗?

我想在地址中省略“用户”外键,但我认为没有用户就不能存在地址。如何更好地建模?

【问题讨论】:

    标签: django-models foreign-key-relationship


    【解决方案1】:

    正如您在问题中提到的相同字段的重复 模型不是一个好主意。

    如果这些是您的实际模型,我建议您使用abstract models:

    from django.db import models
    from django.contrib.auth.Models import User
    
    class Profile(models.Model):
        user = models.OneToOneField(User, related_name="%(app_label)s_%(class)s_related")
        address = models.TextField()
    
        class Meta:
            abstract = True
    
    class Student(Profile):
        pass
    
    class School(Profile):
        contact_person_name = models.CharField(max_length=50)
    

    这将生成两个表:学生、学校和字段 用户、地址和用户、地址、联系人姓名 分别。

    【讨论】:

    • 嗨@crodjer,在一个完全不同的场景中,我想存储用户的费用并对其进行分类,我如何使用您解释的相同概念?每个费用记录都将与一个用户相关联。对于每笔费用,用户必须关联他创建的类别之一。所以我会有Category(user, name) 和Expense(user,amount,category) 之类的东西。但是这里的用户参考是重复的。由于没有共享,我想我不能使用抽象类。
    • 既然学校地址和学生地址是类似的信息,那么它们不应该存储在一个表中,而不是像上面的抽象类示例那样存储在两个表中吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2011-05-13
    • 2021-08-06
    • 2011-02-21
    相关资源
    最近更新 更多