【问题标题】:Models in Python Django not working for Many to Many relationshipsPython Django 中的模型不适用于多对多关系
【发布时间】:2016-10-16 18:35:21
【问题描述】:

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

Person Class 与 Address Class 有一对多的关系

Person 类与 Group 类有多对多的关系

Book 类包含 Person 和 Groups 的集合

这是我的代码:

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 类现在每个 Book 记录只包含 1 条 Person & Group 记录。

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

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

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

我知道如何为 C# 制作所有这些,但我对 Python/Django 中的这个简单任务有点坚持。

【问题讨论】:

  • “一个组现在可以包含多个人,但这些人不包含任何组。”。这是错误的。外键在实体之间建立双向关系,因此person.group_set.all() 将为您提供该人所属的组。此外,您的设计容易受到一致性问题的影响。我不确定您的设计是否应该允许这样做,但是一本书可以归属于与该书所属不同组的人所有。

标签: python django django-models


【解决方案1】:

1) ManyToMany 字段应该只出现在其中一个模型中,并且看起来你可能希望它出现在 Person 模型中。 了解有关 ManyToMany 字段的数据保存在不同的表中很重要。 Django 只允许该字段通过但模型可见(所以基本上,选择它移动方便的位置)。

2)根据您的结构,我建议您使用一个多对多字段通过不同的表。这是一个例子:

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 字段

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2019-05-09
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2012-07-22
    • 2015-02-03
    相关资源
    最近更新 更多