django - Django 中的 .add() 方法未添加多对多关系条目
问题描述
我在向多对多关系字段添加条目时遇到问题。我的模型如下
class Address(models.Model):
id = models.AutoField(primary_key=True)
country = CountryField(blank_label='(select country)', blank=False, null=False, verbose_name='Country')
state = models.CharField(
max_length=50,
choices=STATE_CHOICES,
verbose_name='State',
blank=False,
null=False
)
...
class Volunteer(models.Model):
userID = models.OneToOneField(User, on_delete=models.CASCADE, to_field='id', primary_key=True, related_name='volunteer')
identificationNumber = models.CharField(max_length=50, unique=True, blank=False, null=False, verbose_name='Identification Number')
currentAddress = models.ManyToManyField(Address, related_name='volunteerCurrentAddress', verbose_name='Current Address', blank=False)
permanentAddress = models.ManyToManyField(Address, related_name='volunteerPermanentAddress', verbose_name='Permanent Address', blank=False)
...
def save(self, *args, **kwargs):
self.slug = self.userID.username
super(Volunteer, self).save(*args, **kwargs)
class TemporaryVolunteer(Volunteer):
pass
在视图中,我将currentAddress
和permanentAddress
字段都作为ManyToManyRelatedManager
. 它们是temporaryVolunteer.currentAddress
和temporaryVolunteer.permanentAddress
。我用这些来创建一个新的志愿者实例
volunteer = Volunteer(...)
volunteer.save()
volunteer.currentAddress.add(temporaryVolunteer.currentAddress.all()[0])
volunteer.permanentAddress.add(temporaryVolunteer.permanentAddress.all()[0])
volunteer.save()
但是当我做print(volunteer.currentAddress.all())
or时print(volunteer.permanentAddress.all())
,它返回一个空的查询集。我还检查了管理站点进行确认,志愿者实例上没有地址条目。有什么办法可以用这种方法添加条目?
解决方案
问题在于数据库的设计。我使用了一个新班级TemporaryVolunteer
来存储未经验证的帐户,后来Volunteer
在他们被验证后转移到班级。TemporaryVolunteer
正如我从课堂上继承Volunteer
的那样,Django 处理多对多关系而不重复的方式(来源:https ://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/ )导致了 no 的问题条目被添加到相应的Volunteer
类中。
最初,我通过复制 to 的所有成员Volunteer
来检查这一点TemporaryVolunteer
。在验证它是否有效后,我更改了数据库设计,因为这是一种不好的方法,并isVerified
在类中保留了一个布尔值Volunteer
并完全删除了TemporaryVolunteer
该类。
推荐阅读
- linker - 是否可以让链接器生成一个二进制文件,尽可能接近先前生成的二进制文件?
- python - 使用 python 从通过 USB 连接的相机获取实时流
- ios - MacOS 中的 SecKeyRawSign 不可用
- python - Python中的可视化和聚类
- css - 我无法将固定图像设置为我身体网站的背景
- c# - 无法使用 SET NULL 引用操作创建外键“FK_ApplicationInfos_UserProfiles_UserProfileId”
- reactjs - ReactJS Show alert when user leaves the current browser tab
- java - CAS Spring - 管理客户端会话的方法
- sql-server - 多个自连接
- java - SSL 握手失败 - 找不到合适的证书 - 在没有客户端身份验证的情况下继续