0

djangoでは、多対1の関係と多対多の関係を概念的に区別できないようです。SQLやデータベースでどのように機能するかを理解し、外部キーなどの概念を心から理解していますが、たとえば、次のことは理解していません。

多対多の関係の両端は、もう一方の端への自動APIアクセスを取得します。APIは、「後方」の1対多の関係と同じように機能します。しかし、私はまだそれを概念的に見ることができません。

多対多の例:

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

    def __unicode__(self):
        return u"%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)

    def __unicode__(self):
        return self.headline

    class Meta:
        ordering = (’headline’,)

私はこれを行うことができます:

>>> r = Reporter(first_name=’John’, last_name=’Smith’, email=’john@example.com’)
>>> r.save()
>>> a = Article(id=None, headline="This is a test", pub_date=datetime(2005, 7, 27), reporter=r)
>>> a.save()
>>> a.reporter
<Reporter: John Smith>

したがって、外部キーを介してArticlesクラスからReportersクラスにアクセスできました。

多対多の例:

class Publication(models.Model):
    title = models.CharField(max_length=30)

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = (’title’,)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    def __unicode__(self):
        return self.headline

    class Meta:
        ordering = (’headline’,)

私の質問は、上記の多対多クラスで行ったのと同じように、ArticleクラスのManyToManyFieldを介してPublicationクラスにアクセスできることです。では、M2MはM2oneとどのように異なりますか?m2mでできる他のことは何ですか。(もちろん両方で逆にすることもできますが、混乱しないように、当面は両方の逆の関係を無視しようとしています。)ですから、私の質問をより適切に表現するために、通常はm2mで他に何をしますか。 m2oneで?

免責事項-プログラミングは初めてですが、djangoの公式ドキュメントのモデルに関する100ページのセクション全体を読んでください。可能であれば、それらを参照しないでください。私はすでに彼らから学んでいます。

また、コードの方がよく理解できるので、できればコード例をいくつか含めてください。

4

1 に答える 1

1

1 人のレポーターは多くの記事を書くことができますが、1 つの記事には1 人の レポーターしかいません。

# This will get the reporter of an article
article.reporter
# This will get all the articles of a reporter
reporter.article_set.all()
# You cannot add another reporter to an article
article.reporter.add(r) # This will raise an Error!

一方で、

1 つの記事に多くの出版物が含まれる場合もあれば、1 つの出版物が多くの記事に関連する場合もあります。

# This will get all the publications of an article
article.publications.all()
# This will get all the related articles of a publication
publication.article_set.all()
# You CAN add another publication to an article
article.publications.add(p) # No Error here
于 2013-02-05T20:00:24.060 に答える