我的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
我是否根据所提供的模型处理一对多关系?我希望有一个联系人提供他的个人信息(电话/电子邮件/地址)以及与该联系人相关的全球多个分支机构。
答案 0 :(得分:0)
我仍然没有时间完成你的所有问题,但我会回来编辑请不要downvote
应用程序应位于同一项目中,您可以将一个模型导入为:
import appName.models or
from appName.models import ClassName
在app2模型中,您可以在导入类
后使用foreignKey或manyTomanyfrom 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)
它帮助了我。