Python 如何在Django中连接来自不同应用程序的模型?
我在Django项目中有一些应用程序。我目前正在使用两个应用程序“应用程序”和“用户”,我有两个与模型相关的问题: 问题1: 我想以这样一种方式设计它,以便外部用户在Python 如何在Django中连接来自不同应用程序的模型?,python,django,database,django-models,django-forms,Python,Django,Database,Django Models,Django Forms,我在Django项目中有一些应用程序。我目前正在使用两个应用程序“应用程序”和“用户”,我有两个与模型相关的问题: 问题1: 我想以这样一种方式设计它,以便外部用户在Application/templates/Application/Apply.html上提交他们的联系表单,并将信息添加到数据库中。内部用户也可以从不同的模板添加外部用户:User/templates/User/AddNewContact.html 我可以从内部用户的角度添加新联系人: User/models.py class C
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:用户:ContactDetails
,从技术上讲,这是行不通的,因为我稍后将构建身份验证强>
2) 我觉得通过复制和粘贴,我打破了“不要重复自己”的规则
我应该使用外键连接两个模型吗?这种情况下的最佳实践是什么
问题2
我是否根据提供的模型处理一对多关系?我希望有一个联系人的个人信息(电话/电子邮件/地址)以及与该联系人相关的全球多个分支机构位置。应用程序应位于同一个项目中,您可以将一个模型导入为:
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:你不需要复制粘贴模型。你可以随时使用其他django应用程序中的模型,只需导入它。基本上,你应该做的是,不要将url直接链接到应用程序应用程序中的模板,而是将其连接到视图。在视图文件中,你可以从User.models imp导入模型ort*,并正常使用它们
问题2:据我所知,您的结构提供了您想要的:一个联系人(带有个人信息)与多个国家相关。除了您应该在
contact=models.ForeignKey(Agent,on_delete=models.CASCADE)中用联系人替换代理之外
问题1:请注意,只有在视图中未提供成功url时才会调用“get\u absolute\u url”方法。如果您使用的是CreateView或FormView,则可以通过覆盖get\u success\u 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.
干燥原则得到尊重
问题2:是的,您需要问自己的问题是“一个模型实例(在本例中为Contact)是否有另一个模型(位置)的多个实例?”?如果答案是“是”,则M2M字段应进入您的联系人模型。请参阅解释比萨饼/配料示例。要用于一对多的关系,您可以按以下步骤操作: 在父应用程序(父表)的模型上: 在子应用程序(子表)的模型上:
它帮助了我。如何解决
def get_absolute_url(self):return reverse('User:ContactDetails',kwargs={'pk':self.pk})的问题
?我不希望外部用户被引导到ContactDetails页面,但是,让我们假设到Home/templates/Home.html
中的主页,您可以定义另一个方法get\u Home\u url(self),非常类似于此方法,并在需要时调用它。
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)