2017-03-31 45 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做的很好的解釋! –

相關問題