如何删除 ManyToMany 字段的实例?
How to remove the instance of ManyToMany field?
我有两个模型:
class Organisation(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,related_name='organisation_user',on_delete=models.CASCADE)
name = models.CharField(max_length=100,blank=True)
location = models.CharField(max_length=100,blank=True)
qualification_status = (
('Pending for verification','Pending for verification'),
('Verified','Verified'),
)
qualification = models.CharField(max_length=100,choices=qualification_status,default='Pending for verification',blank=True)
members = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='organisation_members',blank=True)
class Organisation_member(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
organisation = models.ForeignKey(Organisation,on_delete=models.CASCADE,related_name='organisation_staff')
member_name = models.ForeignKey(settings.AUTH_USER_MODEL,related_name='organisation_staff_member',on_delete=models.CASCADE,null=True,blank=True)
is_admin = models.BooleanField(default=False)
我有创建 Organisation_member
模型的信号:
@receiver(post_save, sender=Organisation)
def organisation_admin(sender, instance, created, **kwargs):
for member in instance.members.all():
if Organisation_member.objects.filter(user=instance.user,organisation=Organisation.objects.filter(user=instance.user,name=instance.name).first(),member_name=member).exists():
pass
else:
Organisation_member.objects.update_or_create(User=instance.User,organisation=Organisation.objects.filter(user=instance.user,name=instance.name).first(),member_name=member,is_admin=False)
信号表明,当我在 manytomany 字段中添加成员时,它将自动创建所选成员的 Organisation_member
对象。
信号非常好。
我的问题是相反的,即当我尝试删除 Organisation_member
的对象时,它还应该从父模型的多对多关系中删除该成员。
我试过这个:
@login_required()
def delete_members(request, pk):
user_organisation = get_object_or_404(Organisation, user=request.user)
member_to_delete = Organisation_member.objects.filter(pk=pk)
if member_to_delete.exists():
member_to_delete[0].delete()
for member in user_organisation.members.all():
user_organisation.members.remove(member=member_to_delete[0])
return redirect(reverse('userprofile:organisation_member_list'))
但它不会从父模型中删除成员..
请知道解决办法的大侠帮忙
谢谢
尝试这样的事情:
@login_required()
def delete_members(request, pk):
user_organisation = get_object_or_404(Organisation, user=request.user)
member_to_delete = get_object_or_404(Organisation_member, pk=pk)
user_organisation.members.remove(member_to_delete.member_name)
member_to_delete.delete()
return redirect(reverse('userprofile:organisation_member_list'))
使用这种关系的标准方法是将 Organisation_member
指定为 Organisation
中 members
的 through
模型。然后数据库会在没有任何信号的情况下为您处理。
class Organisation(models.Model):
members = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='Organisation_member')
唯一的问题是您目前在 Organisation_member
中有两个对 User
的引用:member_name
和 user
。为什么?您可能只需要一个,应该删除另一个。如果 Organisation_member
中有两个不同的用户是有原因的,您需要指定用于关系的字段:
members = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='Organisation_member',
through_fields=('organisation', 'member_name'))
就是这样,每当您向 members
添加或从中删除用户时,都会自动添加和删除 Organisation_member
。
我有两个模型:
class Organisation(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,related_name='organisation_user',on_delete=models.CASCADE)
name = models.CharField(max_length=100,blank=True)
location = models.CharField(max_length=100,blank=True)
qualification_status = (
('Pending for verification','Pending for verification'),
('Verified','Verified'),
)
qualification = models.CharField(max_length=100,choices=qualification_status,default='Pending for verification',blank=True)
members = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='organisation_members',blank=True)
class Organisation_member(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
organisation = models.ForeignKey(Organisation,on_delete=models.CASCADE,related_name='organisation_staff')
member_name = models.ForeignKey(settings.AUTH_USER_MODEL,related_name='organisation_staff_member',on_delete=models.CASCADE,null=True,blank=True)
is_admin = models.BooleanField(default=False)
我有创建 Organisation_member
模型的信号:
@receiver(post_save, sender=Organisation)
def organisation_admin(sender, instance, created, **kwargs):
for member in instance.members.all():
if Organisation_member.objects.filter(user=instance.user,organisation=Organisation.objects.filter(user=instance.user,name=instance.name).first(),member_name=member).exists():
pass
else:
Organisation_member.objects.update_or_create(User=instance.User,organisation=Organisation.objects.filter(user=instance.user,name=instance.name).first(),member_name=member,is_admin=False)
信号表明,当我在 manytomany 字段中添加成员时,它将自动创建所选成员的 Organisation_member
对象。
信号非常好。
我的问题是相反的,即当我尝试删除 Organisation_member
的对象时,它还应该从父模型的多对多关系中删除该成员。
我试过这个:
@login_required()
def delete_members(request, pk):
user_organisation = get_object_or_404(Organisation, user=request.user)
member_to_delete = Organisation_member.objects.filter(pk=pk)
if member_to_delete.exists():
member_to_delete[0].delete()
for member in user_organisation.members.all():
user_organisation.members.remove(member=member_to_delete[0])
return redirect(reverse('userprofile:organisation_member_list'))
但它不会从父模型中删除成员..
请知道解决办法的大侠帮忙
谢谢
尝试这样的事情:
@login_required()
def delete_members(request, pk):
user_organisation = get_object_or_404(Organisation, user=request.user)
member_to_delete = get_object_or_404(Organisation_member, pk=pk)
user_organisation.members.remove(member_to_delete.member_name)
member_to_delete.delete()
return redirect(reverse('userprofile:organisation_member_list'))
使用这种关系的标准方法是将 Organisation_member
指定为 Organisation
中 members
的 through
模型。然后数据库会在没有任何信号的情况下为您处理。
class Organisation(models.Model):
members = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='Organisation_member')
唯一的问题是您目前在 Organisation_member
中有两个对 User
的引用:member_name
和 user
。为什么?您可能只需要一个,应该删除另一个。如果 Organisation_member
中有两个不同的用户是有原因的,您需要指定用于关系的字段:
members = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='Organisation_member',
through_fields=('organisation', 'member_name'))
就是这样,每当您向 members
添加或从中删除用户时,都会自动添加和删除 Organisation_member
。