【问题标题】:Accessing an object in a class of a different django model访问不同 django 模型的类中的对象
【发布时间】:2020-06-25 20:12:46
【问题描述】:

从此代码

from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter_name = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

    class Meta:
        ordering = ['headline']

而不是使用 ForeignKey 将整个类 Reporter 放入 reporter_name 我想使用 ForeignKey 将 first_name 放入reporter_name,我问是因为我想在另一个应用程序的不同模型中使用该类。

【问题讨论】:

  • 您不会存储整个对象。 ForeignKey 本身会存储你在字段中引用的对象的主键。
  • 有没有办法只得到reporter_name 中的first_name,即使它不是'ForeignKey'。我希望你明白我的意思,我只希望 Reporter(first_name) 进入reporter_name。
  • 因为它不是unique 字段,所以不,因为这意味着仅基于first_name,您不能引用(唯一的)Reporter
  • 我认为我应该使用 ManyToManyField

标签: python django model


【解决方案1】:

如果您只想存储名称,则可以执行以下操作:

from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter_name = models.CharField(max_length=100, blank=True, null=True)

    def __str__(self):
        return self.headline

    def set_reporter_name(self, reporter_object):
        self.reporter_name = reporter_object.first_name

    class Meta:
        ordering = ['headline']

然后你会像这样保存它:

reporter = Reporter.objects.get(id=id)
article = Article.objects.create(headline=headline, pub_date=pub_date)
article.set_reporter_name(reporter)
article.save()

但是这样做,当您查询文章时,您将失去对 ForeignKey 对象的访问权限,因此您将得到的只是保存的名称,而不是 Reporter 对象。

或者,您可以只创建一个从 ForeignKey 返回reporter_name 的函数,这可能是更好的选择:

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

    def reporter_name(self):
       return self.reporter.first_name

    class Meta:
        ordering = ['headline']

访问方式如下:

article = Article.objects.get(id=id)
name = article.reporter_name()

或在模板中:

{% for article in articles.all %}
 <p>{{ article.headline }} Reported by: {{ article.reporter_name }}</p>
{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多