Django 2.1 - Many-to-many relationships

कई-कई रिश्ते




django

कई-कई रिश्ते

कई-से-कई संबंधों को परिभाषित करने के लिए, ManyToManyField का ManyToManyField

इस उदाहरण में, एक Article कई Publication वस्तुओं में प्रकाशित किया जा सकता है, और एक Publication में कई Article ऑब्जेक्ट हैं:

from django.db import models

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

    def __str__(self):
        return self.title

    class Meta:
        ordering = ('title',)

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

    def __str__(self):
        return self.headline

    class Meta:
        ordering = ('headline',)

इस प्रकार के संचालन के उदाहरण हैं जो पायथन एपीआई सुविधाओं का उपयोग करके किए जा सकते हैं। ध्यान दें कि यदि आप कई-कई संबंधों के लिए एक मध्यवर्ती मॉडल का उपयोग कर रहे हैं, तो संबंधित प्रबंधक के कुछ तरीके अक्षम हैं, इसलिए इनमें से कुछ उदाहरण ऐसे मॉडल के साथ काम नहीं करेंगे।

कुछ Publications बनाएँ:

>>> p1 = Publication(title='The Python Journal')
>>> p1.save()
>>> p2 = Publication(title='Science News')
>>> p2.save()
>>> p3 = Publication(title='Science Weekly')
>>> p3.save()

एक Article बनाएँ:

>>> a1 = Article(headline='Django lets you build Web apps easily')

इसे सहेजे जाने तक आप इसे Publication नहीं जोड़ सकते:

>>> a1.publications.add(p1)
Traceback (most recent call last):
...
ValueError: 'Article' instance needs to have a primary key value before a many-to-many relationship can be used.

बचाओ!

>>> a1.save()

एक Publication साथ Article को संबद्ध करें:

>>> a1.publications.add(p1)

एक और Article बनाएँ, और इसे Publications में प्रदर्शित करने के लिए सेट करें:

>>> a2 = Article(headline='NASA uses Python')
>>> a2.save()
>>> a2.publications.add(p1, p2)
>>> a2.publications.add(p3)

दूसरी बार जोड़ना ठीक है, यह संबंध की नकल नहीं करेगा:

>>> a2.publications.add(p3)

गलत प्रकार का ऑब्जेक्ट जोड़ना TypeError उठाता है:

>>> a2.publications.add(a1)
Traceback (most recent call last):
...
TypeError: 'Publication' instance expected

Create create() का उपयोग करके एक चरण में एक Article में एक Publication बनाएं और जोड़ें:

>>> new_publication = a2.publications.create(title='Highlights for Children')

Article वस्तुओं की उनके संबंधित Publication वस्तुओं तक पहुँच होती है:

>>> a1.publications.all()
<QuerySet [<Publication: The Python Journal>]>
>>> a2.publications.all()
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>

Publication वस्तुओं की उनके संबंधित Article वस्तुओं तक पहुँच होती है:

>>> p2.article_set.all()
<QuerySet [<Article: NASA uses Python>]>
>>> p1.article_set.all()
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>
>>> Publication.objects.get(id=4).article_set.all()
<QuerySet [<Article: NASA uses Python>]>

कई-कई रिश्तों का उपयोग रिश्तों में लुकअप का उपयोग करके किया जा सकता है:

>>> Article.objects.filter(publications__id=1)
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>
>>> Article.objects.filter(publications__pk=1)
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>
>>> Article.objects.filter(publications=1)
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>
>>> Article.objects.filter(publications=p1)
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>

>>> Article.objects.filter(publications__title__startswith="Science")
<QuerySet [<Article: NASA uses Python>, <Article: NASA uses Python>]>

>>> Article.objects.filter(publications__title__startswith="Science").distinct()
<QuerySet [<Article: NASA uses Python>]>

count() फ़ंक्शन distinct() सम्मान करता distinct() साथ ही:

>>> Article.objects.filter(publications__title__startswith="Science").count()
2

>>> Article.objects.filter(publications__title__startswith="Science").distinct().count()
1

>>> Article.objects.filter(publications__in=[1,2]).distinct()
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>
>>> Article.objects.filter(publications__in=[p1,p2]).distinct()
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>

रिवर्स एम 2 एम प्रश्नों का समर्थन किया जाता है (यानी, उस टेबल पर शुरू ManyToManyField पास ManyToManyField नहीं है):

>>> Publication.objects.filter(id=1)
<QuerySet [<Publication: The Python Journal>]>
>>> Publication.objects.filter(pk=1)
<QuerySet [<Publication: The Python Journal>]>

>>> Publication.objects.filter(article__headline__startswith="NASA")
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>

>>> Publication.objects.filter(article__id=1)
<QuerySet [<Publication: The Python Journal>]>
>>> Publication.objects.filter(article__pk=1)
<QuerySet [<Publication: The Python Journal>]>
>>> Publication.objects.filter(article=1)
<QuerySet [<Publication: The Python Journal>]>
>>> Publication.objects.filter(article=a1)
<QuerySet [<Publication: The Python Journal>]>

>>> Publication.objects.filter(article__in=[1,2]).distinct()
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>
>>> Publication.objects.filter(article__in=[a1,a2]).distinct()
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>

संबंधित आइटम को छोड़कर, जैसा आप अपेक्षा करते हैं, वैसे ही काम करता है (हालाँकि SQL शामिल थोड़ा जटिल है):

>>> Article.objects.exclude(publications=p2)
<QuerySet [<Article: Django lets you build Web apps easily>]>

यदि हम कोई Publication हटाते हैं, तो उसके Articles उस तक नहीं पहुंच पाएंगे:

>>> p1.delete()
>>> Publication.objects.all()
<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>]>
>>> a1 = Article.objects.get(pk=1)
>>> a1.publications.all()
<QuerySet []>

यदि हम एक Article हटाते हैं, तो उसके Publications इसे एक्सेस नहीं कर पाएंगे:

>>> a2.delete()
>>> Article.objects.all()
<QuerySet [<Article: Django lets you build Web apps easily>]>
>>> p2.article_set.all()
<QuerySet []>

एक m2m के 'अन्य' अंत के माध्यम से जोड़ना:

>>> a4 = Article(headline='NASA finds intelligent life on Earth')
>>> a4.save()
>>> p2.article_set.add(a4)
>>> p2.article_set.all()
<QuerySet [<Article: NASA finds intelligent life on Earth>]>
>>> a4.publications.all()
<QuerySet [<Publication: Science News>]>

कीवर्ड का उपयोग करके दूसरे छोर से जोड़ना:

>>> new_article = p2.article_set.create(headline='Oxygen-free diet works wonders')
>>> p2.article_set.all()
<QuerySet [<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]>
>>> a5 = p2.article_set.all()[1]
>>> a5.publications.all()
<QuerySet [<Publication: Science News>]>

एक Article से Publication हटाना:

>>> a4.publications.remove(p2)
>>> p2.article_set.all()
<QuerySet [<Article: Oxygen-free diet works wonders>]>
>>> a4.publications.all()
<QuerySet []>

और दूसरे छोर से:

>>> p2.article_set.remove(a5)
>>> p2.article_set.all()
<QuerySet []>
>>> a5.publications.all()
<QuerySet []>

संबंध सेट किया जा सकता है:

>>> a4.publications.all()
<QuerySet [<Publication: Science News>]>
>>> a4.publications.set([p3])
>>> a4.publications.all()
<QuerySet [<Publication: Science Weekly>]>

संबंध सेट साफ़ किए जा सकते हैं:

>>> p2.article_set.clear()
>>> p2.article_set.all()
<QuerySet []>

और आप दूसरे छोर से स्पष्ट कर सकते हैं:

>>> p2.article_set.add(a4, a5)
>>> p2.article_set.all()
<QuerySet [<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]>
>>> a4.publications.all()
<QuerySet [<Publication: Science News>, <Publication: Science Weekly>]>
>>> a4.publications.clear()
>>> a4.publications.all()
<QuerySet []>
>>> p2.article_set.all()
<QuerySet [<Article: Oxygen-free diet works wonders>]>

हमारे द्वारा हटाए गए Article और Publication फिर से बनाएँ:

>>> p1 = Publication(title='The Python Journal')
>>> p1.save()
>>> a2 = Article(headline='NASA uses Python')
>>> a2.save()
>>> a2.publications.add(p1, p2, p3)

कुछ Publications हटाएं - हटाए गए प्रकाशनों के संदर्भ जाने चाहिए:

>>> Publication.objects.filter(title__startswith='Science').delete()
>>> Publication.objects.all()
<QuerySet [<Publication: Highlights for Children>, <Publication: The Python Journal>]>
>>> Article.objects.all()
<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA finds intelligent life on Earth>, <Article: NASA uses Python>, <Article: Oxygen-free diet works wonders>]>
>>> a2.publications.all()
<QuerySet [<Publication: The Python Journal>]>

बल्क कुछ लेख हटाएं - हटाए गए ऑब्जेक्ट के संदर्भों को जाना चाहिए:

>>> q = Article.objects.filter(headline__startswith='Django')
>>> print(q)
<QuerySet [<Article: Django lets you build Web apps easily>]>
>>> q.delete()

delete() जाने के बाद delete() , QuerySet कैश को साफ़ करने की आवश्यकता है, और संदर्भित वस्तुओं को हटा दिया जाना चाहिए:

>>> print(q)
<QuerySet []>
>>> p1.article_set.all()
<QuerySet [<Article: NASA uses Python>]>