我有一个模型:
class People(models.Model):
family = models.CharField(null=True)
phone_numbers = ?
我如何为某些电话号码实现 phone_numbers
。我认为 ManyToManyField
不是这样做的好主意。
对此的最佳做法是什么?
管理员.py
class PhonesInline(admin.TabularInline):
model = models.Phones
class PeopleAdmin(admin.ModelAdmin):
inlines = [
PhonesInline,
]
admin.site.register(models.People, PeopleAdmin)
回答1
您可以做的是创建一个 Phone
模型并使用 https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/#many-to-one-relationships 在 Phone
和 People
之间创建多对一关系。有了这个,您可以将各种电话号码关联到一个人。
class People(models.Model):
family = models.CharField(null=True)
class Phone(models.Model):
number = models.CharField(max_length=15, unique=True)
person = models.ForeignKey(People, on_delete=models.CASCADE)
现在,例如,如果您在名为 people
的变量中有一个 People
实例,您可以使用 https://docs.djangoproject.com/en/4.0/ref/models/querysets/#django.db.models.query.QuerySet.values_list 访问其相关的电话号码:
people.phone_set.values_list('number', flat=True)
作为对您的模型的说明,不建议将 null=True
用于 CharField/TextField
。 https://docs.djangoproject.com/en/4.0/ref/models/fields/#null 声明如下:
避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”values:NULL 和空字符串。在大多数情况下,有两个可能的 values 表示“无数据”是多余的; Django 约定是使用空字符串,而不是 NULL。一个例外是当 CharField 同时设置了 unique=True 和 blank=True 时。在这种情况下,使用空白 values 保存多个对象时,需要 null=True 以避免违反唯一约束。
你也可以看看https://stackoverflow.com/questions/8609192/what-is-the-difference-between-null-true-and-blank-true-in-django,它解决了我的最后一点。
另外我不知道您想将哪种逻辑应用于您的项目,但我认为组织模型及其关系的更好方法是创建一个 Family
类来处理以下家庭:
class Family(models.Model):
name = models.CharField(max_length=100)
class People(models.Model):
family = models.ForeignKey(Family, blank=True, null=True)
class Phone(models.Model):
number = models.CharField(max_length=15, unique=True)
person = models.ForeignKey(People, on_delete=models.CASCADE)
使用这个额外的模型,您将能够在 People
和 Family
之间创建另一个多对一关系。根据您的需要,您应该在创建字段时调整参数,我提供的只是一个示例。