DRY django模型,创建对象列表

时间:2012-06-01 22:50:20

标签: django django-models dry

我有一些用户个人资料的模型,我希望能够存储多种类型的信息,但有一些差别(如家庭或工作电话号码),但我不想使用ForeignKey关系......我该怎么做?

像这样的东西:

class Profile(models.Model):
    phone = ? list of some kind ?

    class Phone(???):
        TYPE_CHOICES = (
                ('H', 'Home'),
                ('W', 'Work'),
                ('F', 'Fax'),
                )
        type = models.CharField(max_length = 1, choices = TYPE_CHOICES) 
        number = models.CharField(max_length = 16)
        private = models.BooleanField()

谢谢!

编辑:我之所以不想使用外键只是因为我原本希望所有与用户相关的信息都显示在配置文件管理页面上。但是......呃...那不太关键

1 个答案:

答案 0 :(得分:3)

为什么不想使用外键?如果您想拥有多个电话号码,那就是您需要/必须这样做的方式。

使用Django和外键很容易,您可以轻松地将内联模型表单集添加到管理页面中,以创建/编辑具有大量电话号码的用户配置文件。

您的模型应如下所示:

class Profile(models.Model):
    name = models.CharField(max_length=40, verbose_name="User name")

class Phone(models.Model):

    TYPE_CHOICES = (
        ('H', 'Home'),
        ('W', 'Work'),
        ('F', 'Fax'),
    )

    profile = models.ForeignKey(Profile)
    type = models.CharField(max_length = 1, choices = TYPE_CHOICES) 
    number = models.CharField(max_length = 16)
    private = models.BooleanField()

然后,您可以使用this之类的内容在一个管理页面中轻松添加/修改每个配置文件的多个电话号码。

在您的示例中,您应该执行以下操作(在django应用程序中的admin.py文件中):

class PhoneInline(admin.TabularInline):
    model = Phone

class ProfileAdmin(admin.ModelAdmin):
    inlines = [
        PhoneInline,
    ]

admin.site.register(Profile, ProfileAdmin)

现在,您可以转到管理界面并尝试添加新配置文件。您将看到每个配置文件可以添加多个电话。我希望它可以帮助你...

最后,我建议你去参观django的tutorials。你会理解很多东西,你会很好地了解如何使用它。