<p>使用字符串文本引用模型比使用模型类引用模型要好。Django可以处理此问题,并将自动解决这些问题:</p>
<pre><code># chat/models.py
from django.db import models
class Chat(models.Model):
name = models.CharField(max_length=100, default="private")
class Message(models.Model):
sender = models.ForeignKey(<b>'user.User'</b>, on_delete=models.CASCADE)
receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)
# user/models.py
from django.db import models
class User(AbstractUser):
chats = models.ManyToManyField(Chat, blank=True)
subscriptions = models.ManyToManyField(<b>'sowi.Sowi'</b>, related_name="subscriptions", blank=True)
memberships = models.ManyToManyField(<b>'sowi.Sowi'</b>, related_name="memberships", blank=True)
blocked = models.ManyToManyField("self", related_name="blocked", blank=True)
# sowi/models.py
from django.db import models
class Sowi(models.Model):
owner = models.ForeignKey(<b>'user.User'</b>, on_delete=models.CASCADE)
chat = models.OneToOneField(<b>'chat.Chat'</b>, blank=True, null=True, on_delete=models.CASCADE)</code></pre>
<p>如果<a href="https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#referencing-the-user-model" rel="noreferrer">reference the user model [Django-doc]</a>设置<a href="https://docs.djangoproject.com/en/3.0/ref/settings/#std:setting-AUTH_USER_MODEL" rel="noreferrer"><strong>^{<cd1>}</strong> setting [Django-doc]</a>并使用此设置,则更好,这样,如果以后改变主意,您可以更方便地更改此设置:</p>
<pre><code># chat/models.py
from django.conf import settings
from django.db import models
class Chat(models.Model):
name = models.CharField(max_length=100, default="private")
class Message(models.Model):
sender = models.ForeignKey(<b>settings.AUTH_USER_MODEL</b>, on_delete=models.CASCADE)
receiver = models.ForeignKey(Chat, on_delete=models.CASCADE)
# user/models.py
from django.db import models
class User(AbstractUser):
chats = models.ManyToManyField(Chat, blank=True)
subscriptions = models.ManyToManyField('sowi.Sowi', related_name="subscriptions", blank=True)
memberships = models.ManyToManyField('sowi.Sowi', related_name="memberships", blank=True)
blocked = models.ManyToManyField("self", related_name="blocked", blank=True)
# sowi/models.py
from django.conf import settings
from django.db import models
class Sowi(models.Model):
owner = models.ForeignKey(<b>settings.AUTH_USER_MODEL</b>, on_delete=models.CASCADE)
chat = models.OneToOneField('chat.Chat'</code></pre>