Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django模型外键关系_Python_Django_Django Models - Fatal编程技术网

Python django模型外键关系

Python django模型外键关系,python,django,django-models,Python,Django,Django Models,我有3个模型:用户、课程、公司 class User(models.Model): pass class Company(models.Model): pass class Lesson(models.Model): user = models.ForeignKey(User) company = models.ForeignKey(Company) 如何为两家公司添加一个课程您应该将ForeignKey放入公司模型: class Company(mod

我有3个模型:用户、课程、公司

class User(models.Model):
    pass

class Company(models.Model):
    pass  

class Lesson(models.Model):
    user = models.ForeignKey(User)
    company = models.ForeignKey(Company)

如何为两家公司添加一个课程

您应该将
ForeignKey
放入
公司
模型:

class Company(models.Model):
    lesson = models.Foreignkey(lesson)
创建新的公司对象,并将其添加到课程中:

>>> c1 = Comapany(attr="blah", attr2="foo")
>>> l1.comapany_set.add(c1)
您还可以将公司对象列表添加到课程中

>>> l1.comapany_set.add(*company_objs)
现在,您可以使用
company\u set
attribute访问与特定课程相关的公司:

lesson.company_set.all()
此外,您现在还可以为不同的公司分配一个课程:

company1.lesson = lesson
company2.lesson = lesson

您可以通过shell实现这一点:
python manage.py shell

a = Company.objects.first()
b = Company.objects.last()
c = Lesson.objects.first()

a.lesson_set.add(c)
b.lesson_set.add(c)
如果您使用:
related\u name

class Lesson(models.Model):
    company = models.ForeignKey(Company, related_name='lessons')
从现在起,您可以像这样使用它:

a.lessons.add(c)
b.lessons.add(c)

如果
公司
有多个
课程
s,并且您还希望
课程
有多个
公司
s,则应使用
ManyToManyField

class Lesson(models.Model):
    user = models.Foreignkey(User)
    companies = models.ManyToManyField(Company)

c1 = Company()
c1.save()
c2 = Company()
c2.save()

l1 = Lesson()
l1.companies.add(c1, c2)

有什么方法可以处理外键关系吗?如果许多关系只存在于
公司
端,那么您可以使用
外键
,正如Nevermoner所描述的那样。但是,如果您还希望每个
公司有许多
课程
(如您的开始示例所示),那么您需要一个
ManyToManyField
。如果我在实时数据库中更改为ManyToManyField,我会遇到什么样的问题如果您进行此更改,然后进行迁移,Django将引入一个额外的透明联接表来支持多对多关系。这可能需要根据现有外键关系手动填充数据。这绝对是您在开发中首先应该做的事情(最好是使用live db的副本),以充分理解其含义。感谢您的帮助!你有必要保留ForeignKey而不是使用很多吗?是的,它在直播项目中,然后尝试我的答案中的概念,并让我知道结果。我尝试了,但没有效果。到底什么不起作用?你能提供一些回溯吗?