django - 我如何在 django 中创建一个没有 manytomany 字段的 muti value 文件?

我有一个模型:

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-relationshipsPhonePeople 之间创建多对一关系。有了这个,您可以将各种电话号码关联到一个人。

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/TextFieldhttps://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)

使用这个额外的模型,您将能够在 PeopleFamily 之间创建另一个多对一关系。根据您的需要,您应该在创建字段时调整参数,我提供的只是一个示例。

相似文章

随机推荐

最新文章