你如何决定在django中创建一个新模型与一个字段?

时间:2011-08-03 13:50:28

标签: django

我正在为我的新django网站创建一个用户个人资料类,我正在尝试决定如何在我的模型中表示用户的实际地址。

更好的做法是创建一个新的模型子类并使用OneToOne键引用它,如

class UserProfile(models.Model):
    ...
   address = models.OneToOneField(AddressModel)
    ...
class AddressModel(models.Model)
    street_address = models.CharField(max_length=30)
    city = models.CharField(max_length=15)
     ....

或者更好的是创建一个像

这样的新地址字段
class UserProfile(models.Model):
     ...
    address = AddressField(location_dict)
     ...
class AddressField(models.Field)
    # details go here
    ...

3 个答案:

答案 0 :(得分:4)

如果条目可以独立创建,我通常会发现单独的模型很有用。例如,如果您最终得到一组地址和一组用户,并非所有用户都会立即链接,那么我会将它们分开。

但是,如果数据库中的所有地址始终立即与用户关联,我只需向模型添加一个新字段。

注意:有些人会告诉你,拥有可以为空的数据库列是错误和邪恶的,因此如果你的任何地址都是None,你应该有一个单独的模型。我不同意;虽然通常有很多理由可以避免可空列,但在这种情况下,我发现检查空地址比检查一对一模型条目是否存在更加繁琐是不方便的。

答案 1 :(得分:3)

像以利一样,这是一个独立的问题。对于这个特定示例,我将地址设为UserProfile字段,但前提是您希望每个用户有一个地址。如果每个用户可能有多个地址(例如家庭住址和休假地址),那么我建议使用ForeignKey设置模型,该模型建立多对一关系。

class UserProfile(models.Model):
    ...

class AddressModel(models.Model)
    user = models.ForeignKey(UserProfile)
    street_address = models.CharField(max_length=30)
    city = models.CharField(max_length=15)
    location = models.CharField(max_length=15) #"Home," "work," "vacation," etc.

然后可以创建许多AddressModel对象并将其与每个UserProfile关联。

答案 2 :(得分:1)

要回答你的问题,我会说一般来说,最好将其他用户提到的地址分开。

我认为您对数据库规范化的了解越多,这个问题就越容易回答。

这篇文章Using MySQL, Normalisation应该可以帮助您弄清楚规范化“形式”的基础知识。顺便说一句,即使它的标题是MySQL,它对于关系数据库来说也是非常通用的。

虽然您并不总是需要浏览所有项目的所有正常表格,但了解它确实有帮助。