【问题标题】:Use of foreignKey between app models in Django 1.10在 Django 1.10 中的应用程序模型之间使用 foreignKey
【发布时间】:2017-08-25 18:41:06
【问题描述】:

我有一个用 Django 1.10 构建的网站。该网站有 3 个不同的应用:团队、成员和新闻。

第一个名为团队的应用有一个名为团队的模型。

这是团队/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 的模型。

这是会员/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

【问题讨论】:

  • 请添加无效的代码minimal reproducible example。从您的描述中不清楚您的问题到底是什么。
  • 是的@Bulva,但它似乎什么也没做
  • 希望解释和代码足够@HåkenLid,谢谢。
  • 当您说“它不起作用”时,您必须准确解释您的意思。如果您遇到异常,请在您的问题中包含错误消息和完整的回溯

标签: python django model foreign-keys


【解决方案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

在views.py中:

albert_teams = albert.teams

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

【讨论】:

  • 非常感谢,这正是我想要的!我真的很感激。
  • 我的情况是,一个成员只能是一个团队的一员。唯一的问题是在views.py 中我使用的是基于类的视图,所以我需要在该文件中执行任何操作吗?另外,如果您不介意,还有最后一件事:在我的团队模型中,如果我想向成员展示它具有的功能,我该怎么做?谢谢
【解决方案2】:

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

在 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

改变你的模型状态。

祝你好运:)

【讨论】:

【解决方案3】:

试试这个:

from teams.models import Team

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

【讨论】:

  • 它给了我一个错误 ImportError: cannot import name Equipo
  • 现在您应该真正编辑您的答案并添加您的代码。 @haken lid 怎么说
  • 我添加了两个模型的所有代码,你能看到吗?因为我都粘贴了,但我不确定你能看到它。非常感谢
  • 我使用 sublime @Bulva
  • 该错误显然出现在您的问题中未包含的代码的其他部分中。异常的回溯将准确地告诉您在代码中的哪个位置引发了错误。您正在尝试导入一些不存在的类,或者从不正确的位置导入它。
猜你喜欢
  • 2016-04-17
  • 2015-08-16
  • 2011-05-07
  • 2023-01-11
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
相关资源
最近更新 更多