Python Django中的模型不适用于多对多关系

时间:2016-10-16 18:35:22

标签: python django django-models

我正在尝试创建适合以下要求的正确Django模型:

Person Class与Address Class具有1对多的关系

Person Class与Group Class有很多关系

Book Class包含人物和群组的集合

这是我的代码:

class Person(models.Model):
    first_name = models.CharField(max_length=15)
    last_name = models.CharField(max_length=20)

    def __str__(self):
        return  self.first_name+ ' - ' + self.last_name


class Address(models.Model):
    person = models.ForeignKey(Person)  
    address_line = models.CharField(max_length=200)

    def __str__(self):
        return self.address_line


class Group(models.Model):
    group_name = models.CharField(max_length=12)
    persons = models.ManyToManyField(Person)

    def __str__(self):
        return self.group_name

class Book(models.Model):
     record_name = models.CharField(max_length=12)
     person = models.ForeignKey(Person )  
     group = models.ForeignKey(Group )  

     def __str__(self):
         return self.record_name

然而,它不正确: 1)一个小组现在可以包含多个人,但人不包含任何小组。 我不确定是否应该在Person类中添加以下代码:

groups = models.ManyToManyField(Group)

2)Book类现在只包含1个Person& amp;的记录。每本书记录组。

3)当我将外键添加到模型中时,我删除了 on_delete标签:

person = models.ForeignKey(Person, on_delete=models.CASCADE())

因为它没有编译它,要求一些参数。

我知道如何为C#制作所有这些内容,但我在Python / Django中对这个简单的任务很有帮助。

1 个答案:

答案 0 :(得分:1)

1)ManyToMany字段应该只出现在其中一个模型中,并且可以在Person模型中看到你可能想要的东西。 了解有关ManyToMany字段的数据保存在不同的表中非常重要。 Django只允许这个字段通过buth模型可见(所以基本上,选择它移动方便的地方)。

2)通过你的结构看,我建议你使用ManyToMany字段一个不同的表格。这是一个例子:

class Activity(models.Model):
    name = models.CharField(max_length=140)
    description = models.TextField(blank=True, null=True)

class Route(models.Model):
    title = models.CharField(max_length=140)
    description = models.TextField()
    activities_meta = models.ManyToManyField(Activity, through = 'RouteOrdering')

class RouteOrdering(models.Model):
    route = models.ForeignKey(Route, on_delete=models.CASCADE)
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name='activita')
    day = models.IntegerField()
    order = models.IntegerField(default=0)

这种方式将数据绑定到ManyToMany字段