如何在Django中连接不同应用程序的模型?

时间:2017-09-03 02:16:18

标签: python django database django-models django-forms

我的Django项目中有一些应用程序。我目前正在使用两个应用程序"应用程序"和"用户"我有两个与模型有关的问题:

问题1:

我想以这样的方式设计它,以便外部用户在Application/templates/Application/Apply.html上提交他们的联系表单,并且信息将被添加到数据库中。内部用户也可以添加外部用户,但可以使用其他模板:User/templates/User/AddNewContact.html

我可以从内部用户的角度添加新联系人:

User/models.py

class Contact(models.Model):
    ContactName = models.CharField(max_length = 250, default='')
    ContactResidence = models.CharField(max_length = 250, default='')
    Tel = models.CharField(max_length = 250, default='')

    def get_absolute_url(self):
        return reverse('User:ContactDetails', kwargs={'pk': self.pk}
        )

    def __str__(self):
        return self.ContactName



class Locations(models.Model):
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    Country = models.CharField(max_length=250, default='')

    def __str__(self):
        return self.Country

我打算复制这个模型并将其粘贴到Application / models.py中,但有两个问题:

1)我不希望外部用户被定向到URL:User:ContactDetails,从技术上讲,它不会成功,因为我稍后会构建身份验证。

2)我觉得通过复制和粘贴,我打破了“不要重复自己”#34;规则。

我应该使用外键连接两个型号吗?在这种情况下,最佳做法是什么?

问题2

我是否根据所提供的模型处理一对多关系?我希望有一个联系人提供他的个人信息(电话/电子邮件/地址)以及与该联系人相关的全球多个分支机构。

4 个答案:

答案 0 :(得分:0)

我仍然没有时间完成你的所有问题,但我会回来编辑请不要downvote

应用程序应位于同一项目中,您可以将一个模型导入为:

import appName.models or

from appName.models import ClassName

在app2模型中,您可以在导入类

后使用foreignKey或manyTomany
from appsName.models import ClassName

class Person(models.Model):
      con = ForeignKey(ClassName)

答案 1 :(得分:0)

问题1:嗯,您不需要复制粘贴模型。您可以随时使用其他django应用程序中的模型,只需要导入它。基本上你应该做的是,不应该将url直接链接到Applications应用程序中的模板,而应该将它连接到视图。在视图文件中,您可以导入模型from User.models import *,并正常使用它们。

问题2:据我所知,您的结构提供了您想要的问题:一个与多个国家/地区相关联的联系人(包含个人信息)。除非您应在contact = models.ForeignKey(Agent, on_delete=models.CASCADE)

中替换联系人代理

答案 2 :(得分:0)

问题1:请注意' get_absolute_url'只有在您未在视图中提供成功网址时才会调用此方法。如果您使用的是CreateView或FormView,则可以通过覆盖get_success_url方法来指定成功URL,例如:

class ContactCreateView(CreateView):
    model = Contact
    fields = ['ContactName', 'ContactResidence', 'Tel']

    def get_success_url(self):
       if not self.request.user.internal:  # e.g. internal is a User bool field 
           return HttpResponseRedirect('some/external/url/')
       return super().get_success_url()  # call get_absolute_url model method.

尊重DRY原则。

问题2:是的,您需要问自己的问题是模型实例(在本例中为联系人)是否有许多其他模型(位置)的实例?&#39 ;如果答案是肯定的,那么M2M字段应该进入您的Contact模型。请参阅解释披萨/浇头示例的django docs

答案 3 :(得分:0)

要使用一对多关系,可以按照以下步骤进行操作:

在父应用(父表)的模型上:

class Department(models.Model):
    dept_id = models.AutoField(primary_key=True)

在子应用(子表)的模型上:

from appname.models import Department
class Office(models.Model):
    office_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)
    dept = models.ForeignKey(Department, on_delete=models.CASCADE)

它帮助了我。