2017-03-31 63 views
-1

我有一个在Django 1.10中构建的网站。该网站有3个不同的应用程序:团队,成员和新闻。在Django的应用模型之间使用foreignKey 1.10

第一个称为团队的应用程序有一个叫Team的模型。

这是球队/ models.py:

from django.db import models 
from django.db.models.signals import pre_save 
from django.utils.text import slugify 


class Team(models.Model): 
     name = models.CharField(max_length=255) 
     description = models.TextField() 
     slug = models.CharField(max_length=255, default='team', editable=True) 



     class Meta: 
       ordering = ('name',) 

     def __unicode__(self): 
       return self.name 

第二个应用程序,称为成员已呼吁会员一个模型。

这是会员/ models.py:

from django.db import models 

class Piloto(models.Model): 
     name = models.CharField(max_length=255) 
     biography = models.TextField() 
     slug = models.CharField(max_length=255, default='piloto', editable=True) 

     class Meta: 
       ordering = ('name',) 

     def __unicode__(self): 
       return self.name 

我要的是包括成员简档球队内线的名字,所以我知道它应该是这样的:

team_of_member = models.ForeignKey(); 

但是我不知道要在括号里面写些什么,或者如何将团队的模型导入到成员的模型中。我正在关注Django 1.10的文档,但它不起作用,我也试过这个link,但它不起作用。你能帮忙吗?由于

编辑: 我试图做的@Bulva是在暗示,所以我的代码是现在这个样子:

from django.db import models 
from equipos.models import Team 

class Member(models.Model): 
     name = models.CharField(max_length=255) 
     team = models.ForeignKey('teams.Team', null=True) 
     biography = models.TextField() 
     slug = models.CharField(max_length=255, default='piloto', editable=True) 

     class Meta: 
       ordering = ('name',) 

     def __unicode__(self): 
       return self.name 
+0

请添加不工作的代码[mcve]。从描述中不清楚你的问题是什么。 –

+0

是@Bulva,但它似乎什么都不做 – Albert

+0

我希望解释和代码就够了@HåkenLid,谢谢。 – Albert

回答

1

你想要的是提供团队的成员是成员。这完全取决于您的业务逻辑。根据定义,一个团队有很多成员,但是一个成员可以成为许多团队的一部分吗?如果是的话,你有多对多的关系。如果不是,你有一对多的关系。

在一对多假设下,外键信息必须放入参考模型中。然后:

from django.db import models 
from team.models import Team # Generally, apps are in all lower-case (assuming your app is called team) 

class Member(models.Model): 
    name = models.CharField(max_length=255) 
    team = models.ForeignKey('team.Team', related_name = 'members', null=True) # Do not forget to put team.Team inside a pair of single-quotes. 
    biography = models.TextField() 
    slug = models.CharField(max_length=255, default='piloto', editable=True) 

    class Meta: 
      ordering = ('name',) 

    def __unicode__(self): # use def __str__(self): in Python 3+ 
      return self.name 

在你看来,你就可以这样说:

albert_team = albert.team 
albert_teammates = albert_team.members 

在许多一对多的假设,它是更自然捕捉组队模式的关系:

from django.db import models 
from django.db.models.signals import pre_save 
from django.utils.text import slugify 


class Team(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.TextField() 
    slug = models.CharField(max_length=255, default='team', editable=True) 
    members = models.ManyToManyField('team.Member', related_name = 'teams') 

    class Meta: 
      ordering = ('name',) 

    def __unicode__(self): 
      return self.name 

在视图中。py:

albert_teams = albert.teams 

all_albert_teammates = [] 
for team in albert_teams: 
    all_albert_teammates.append(team.members) 
+0

非常感谢你,那正是我一直在寻找的!对此,我真的非常感激。 – Albert

+0

我是在一个成员只能成为一个团队的一部分的情况下。唯一的问题是在views.py中我使用基于类的视图,所以我需要在该文件中做任何事情?而且,如果你不介意,还有最后一件事:在我的团队模型中,如果我想向成员展示它,我该怎么做呢?谢谢 – Albert

1

试试这个:

from teams.models import Team 

# in the member model field 
team_of_member = models.ForeignKey(Team); 
+0

它给我一个错误ImportError:无法导入名称Equipo – Albert

+0

现在你应该真的编辑你的答案并添加你的代码。 How @haken lid says – Bulva

+0

我添加了这两种模型的所有代码,你能看到它吗?因为我粘贴了所有内容,但我不确定你能看到它。非常感谢 – Albert

1

为了做什么你要(假设提供的代码是你完整的“有问题的”代码),你应该:

在会员/ models.py:

from django.db import models 
from teams.models import Team # <--add this line 

class Piloto(models.Model): 
     name = models.CharField(max_length=255) 
     team_of_member = models.ForeignKey(Team, on_delete=models.CASCADE); # <--add this line 
     biography = models.TextField() 
     slug = models.CharField(max_length=255, default='piloto', editable=True) 

     class Meta: 
       ordering = ('name',) 

     def __unicode__(self): 
       return self.name 

完成此操作后,请记住:
python manage.py makemigrations
python manage.py migrate

改变你的模型状态。

祝你好运:)

+0

它的工作,但把'team_of_member = models.ForeignKey('队,队',on_delete = models.CASCADE);' – Albert

+0

here http://stackoverflow.com/questions/38388423/what-does-on-delete-do- on-django-models?answertab = votes#tab-top是什么models.CASCADE做的很好的解释! –