访问不同Django模型的类中的对象

时间:2020-06-25 20:12:46

标签: python django model

通过此代码

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,我问,因为我想在另一个应用程序的不同模型中使用该类。

1 个答案:

答案 0 :(得分:0)

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

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返回report_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 %}
相关问题