Използване на ForeignKey между модели на приложения в Django 1.10

Имам уебсайт, изграден в Django 1.10. Сайтът има 3 различни приложения: екипи, членове и новини.

Първото приложение, наречено teams, има един модел, наречен Team.

Това е 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

Второто приложение, наречено members, има един модел, наречен Member.

Това е Member/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

person Albert    schedule 31.03.2017    source източник
comment
Моля, добавете кода, който не работи минимално възпроизводим пример. От описанието ви не става ясно какъв точно е проблемът ви.   -  person Håken Lid    schedule 31.03.2017
comment
да, @Bulva, но изглежда не прави нищо   -  person Albert    schedule 31.03.2017
comment
Надявам се, че обяснението и кодът са достатъчни @HåkenLid, Благодаря.   -  person Albert    schedule 31.03.2017
comment
Когато казвате, че не работи, трябва да обясните какво точно имате предвид. Ако получите изключение, включете съобщението за грешка и пълното проследяване във вашия въпрос.   -  person Håken Lid    schedule 31.03.2017


Отговори (3)


Това, което искате, е да предоставите екипите, в които членът е член. Всичко зависи от вашата бизнес логика. Екипът има много членове по дефиниция, но може ли един член да бъде част от много екипи? Ако да, имате връзка много към много. Ако не, имате връзка "един към много".

При предположението "един към много" информацията за външния ключ трябва да бъде поставена в референтния модел. Тогава:

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

В views.py:

albert_teams = albert.teams

all_albert_teammates = []
for team in albert_teams:
    all_albert_teammates.append(team.members)
person EarlyCoder    schedule 02.04.2017
comment
Благодаря ви много, точно това търсех! Аз наистина го оценявам. - person Albert; 04.04.2017
comment
Аз съм за това, че един член може да бъде част само от един отбор. Единственото нещо е, че в views.py използвам базирани на клас изгледи, така че трябва ли да правя нещо в този файл? И също така, едно последно нещо, ако нямате нищо против: в модела на моите екипи, ако искам да покажа на членовете, че има, как мога да го направя? Благодаря - person Albert; 04.04.2017

Опитайте тази:

from teams.models import Team

# in the member model field
team_of_member = models.ForeignKey(Team);
person Bulva    schedule 31.03.2017
comment
Дава ми грешка ImportError: не може да импортира име Equipo - person Albert; 31.03.2017
comment
Сега наистина трябва да редактирате отговора си и да добавите своя код. Как @haken капак каза - person Bulva; 31.03.2017
comment
Добавих целия код от двата модела, виждате ли го? защото поставих всички, но не съм сигурен, че можете да го видите. Благодаря много - person Albert; 31.03.2017
comment
Използвам sublime @Bulva - person Albert; 31.03.2017
comment
Не споменавате Equipo във въпроса си. Съобщението за грешка ще каже в кой файл и на кой ред се опитвате да импортирате. - person Håken Lid; 31.03.2017
comment
Тази грешка очевидно е в друга част от кода ви, която не сте включили във въпроса си. Проследяването на изключението ще ви каже точно къде в кода е възникнала грешката. Опитвате се да импортирате клас, който не съществува, или да го импортирате от неправилно място. - person Håken Lid; 31.03.2017

За да направите това, което искате (ако приемем, че предоставеният код е вашият пълен „проблематичен“ код), трябва:

В Member/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

за да промените състоянието на вашите модели.

Късмет :)

person John Moutafis    schedule 31.03.2017
comment
проработи, но поставих team_of_member = models.ForeignKey('teams,Team', on_delete=models.CASCADE); - person Albert; 31.03.2017
comment
тук stackoverflow.com/questions/38388423/ е много добро обяснение какво правят моделите.CASCADE! - person John Moutafis; 31.03.2017