python - Django中的ManyToMany关系“添加朋友,删除朋友”不起作用
问题描述
我如何解决这个多对多关系问题。我正在建立一个像 Facebook 一样的“添加和删除朋友”系统。“如果 A 与 B 成为朋友,则 B 与 A 成为朋友”。
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=500, null=True)
location = models.CharField(max_length=50, null=True, blank=True)
class Friend(models.Model):
friend_user = models.ManyToManyField(User)
在从管理员的配置文件中选择两个用户以创建与超级用户的关系并保存后。
当我访问 shell 以尝试以下命令时,出现了两个问题:
from django.contrib.auth.models import User
from accounts.models import Friend
实例化后:
friend = Friend()
当我键入时:
friend
Shell 返回:
<Friend: Friend object (None)>
我相信问题出在上面的那行,它不应该返回“无”
此外,当我尝试添加关系时:
friend.friend_user.add(User.objects.last())
Shell 返回:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/macadmin/Documents/Django_wapps/fbook/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 498, in __get__
return self.related_manager_cls(instance)
File "/Users/macadmin/Documents/Django_wapps/fbook/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 795, in __init__
(instance, self.pk_field_names[self.source_field_name]))
ValueError: "<Friend: Friend object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.
任何帮助将不胜感激。
PS:我正在使用本教程:https ://www.youtube.com/watch?v=nwpLCa79DUw&list=PLw02n0FEB3E3VSHjyYMcFadtQORvl1Ssj&index=54
解决方案
由于“朋友”是 s 之间的多对多关系Profile
,因此您可以将字段重新带入 Profile 类并使用字符串引用相同的模型,"self"
.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=500, null=True)
location = models.CharField(max_length=50, null=True, blank=True)
friends = models.ManyToManyField("self")
推荐阅读
- spartacus-storefront - Spartacus 'ErrorPageTemplate' 类添加到 app-root
- javascript - 使用控制台代码等待,直到页面上的计时器剩余 10 秒
- json - Neo4j 形成 json 数组
- php - AJAX - 从包含的 AJAX PHP foreach 中删除 MySQL 中的一行
- html - 如何将 ngOptionValue 设置为我的 ng 选项?
- r - 比较两列,如果一列等于 NA,则使用另一列更新它
- reactjs - 如何在 reactjs 中不渲染组件的特定部分
- c# - 无法在 C# 中使用“Microsoft.CrmSdk.XrmTooling.CoreAssembly”连接 Dynamics 365 统一接口
- c# - 单击CustomTaskPane上的按钮时如何更改功能区上的按钮标签(Word Add In VSTO)
- android - 如何将数据从纯原生 android 类传递到 javascript