簡體   English   中英

Django將項目添加到多對多關系

[英]Django adding item to many-to-many relationships

我是django的新手,因此是個問題。 我有以下Feed對象和User對象,它們之間具有多對多關系

class Feed(Base):
    headline = models.CharField(max_length=255)
    link = models.CharField(max_length=255)
    summary = models.TextField()
    reader = models.ManyToManyField(User, through='Bookmark')

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=True, unique=True, max_length=255)
    full_name = models.CharField(max_length=255, blank=True, null=True)

兩者通過Bookmark對象關聯。

class Bookmark(Base):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    feed = models.ForeignKey(Feed, on_delete=models.CASCADE, null=True)

我的問題是

  1. 如何為用戶添加書簽(或供稿)?

  2. 如何獲取用戶已添加書簽的所有供稿?

任何幫助表示贊賞。

這是解決您的問題的好例子

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

對於此模型,如果要添加成員資格,請執行以下操作:

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason="Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all()
<QuerySet [<Person: Ringo Starr>]>
>>> ringo.group_set.all()
<QuerySet [<Group: The Beatles>]>
>>> m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason="Wanted to form a band.")
>>> beatles.members.all()
<QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>]>

與普通的多對多字段不同,您不能使用add(),create()或set()創建關系:

>>> # The following statements will not work
>>> beatles.members.add(john)
>>> beatles.members.create(name="George Harrison")
>>> beatles.members.set([john, paul, ringo, george])

您可以在Django Docs中更好地看到這一點

好吧,讓我們從頭開始。

如您所知,當您使用Django生成M2M關系時,您將使用ManyToManyField 如果您不關心M2M表的詳細信息,Django將為您管理它。 如果要指定中間表,則可以使用ManyToManyField.through 確實和您一樣。 為了說明的目的,我將簡化您的模型。 像這樣:

class User(models.Model):
    username = models.CharField(null=True, unique=True, max_length=255)

class Feed(models.Model):
    headline = models.CharField(max_length=255)
    reader = models.ManyToManyField(User, through='Bookmark')

class Bookmark(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    feed = models.ForeignKey(Feed, on_delete=models.CASCADE, null=True)

讓我們開始Django交互式shell。 我假設您有一個空數據庫。

$ django manage.py shell

首先導入模型

>>> from yourAppName.models import * 

現在,創建一些數據:

>>> from bat.models import *
>>> u1 = User(username = 'foo')
>>> u1.save()
>>> u2 = User(username = 'bar')
>>> u2.save()
>>> User.objects.all() # get Users u1 and u2
<QuerySet [<User: User object>, <User: User object>]>
>>> f1 = Feed(headline = 'How to use M2M in Django')
>>> f1.save()
>>> Feed.objects.all() # get Feed f1
<QuerySet [<Feed: Feed object>]>
  1. 如何為用戶添加書簽(或供稿)?

在這種情況下,您不能使用Feed.reader.add(u1) ,因為您指定的是中間模型,所以必須使用Bookmark的Manager。

>>> b1 = Bookmark(user=u1, feed = f1) # add Feed f1 to User u1
>>> b1.save() # save into database

我們還可以添加另一個書簽:

>>> f2 = Feed(headline = 'Fetching data in Django like a pro!')
>>> f2.save()
>>> b2 = Bookmark(user=u1, feed = f2) # add Feed f2 to User u1
>>> b2.save() # save into database

大功告成! 現在,我們可以檢查一切是否正常。

>>> brandNewBookMark = Bookmark.objects.all()[0] # get the first bookmark
>>> print(brandNewBookMark.user.username) # it's Foo!
foo
>>> print(brandNewBookMark.feed.headline) # Foo subscribed to f1!
u'How to use M2M in Django'
  1. 如何獲取用戶已添加書簽的所有供稿?

您可以簡單地利用Feed.reader字段。 例如,

>>> for f in Feed.objects.filter(reader = u1):
...     print(f.headline)
...    
How to use M2M in Django
Fetching data in Django like a pro!

而已! 進一步的信息在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM