使用多多关系的内联格式集



我有AbstractUser和Relationship模型。用户模型通过关系模型有许多字段

class User(AbstractUser):
username = models.CharField(
verbose_name="username", max_length=256, unique=True)
first_name = models.CharField(verbose_name="first name", max_length=30)
last_name = models.CharField(verbose_name="last name", max_length=30)
slug = models.SlugField(max_length=255, unique=True, blank=True)
date_joined = models.DateTimeField(
verbose_name="joined date", auto_now_add=True)
friends = models.ManyToManyField('self', through='Relationship', symmetrical=False,
related_name='following')
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
def __str__(self):
return str(self.username)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.username)
super().save(*args, **kwargs)

class Relationship(models.Model):
from_person = models.ForeignKey(
User, related_name='from_people', on_delete=models.CASCADE)
to_person = models.ForeignKey(
User, related_name='to_people', on_delete=models.CASCADE)
def __str__(self):
return f"from {self.from_person} to {self.to_person}"

如何创建具有fields=['from_person'和'to_person']的内联formset来为彼此分配用户这就是我试图做的,但由于fk_name,我不能同时拥有两个字段请帮忙!

def staff_profile_view(request):
user = User.objects.get_by_natural_key(request.user)
AssignFriendsFormSet = inlineformset_factory(
User, Relationship, fk_name='from_person', fields=('to_person', 'from_person',))
formset = AssignFriendsFormSet(
queryset=Relationship.objects.none(), instance=user)
if request.method == "POST":
formset = AssignFriendsFormSet(request.POST, instance=user)
if formset.is_valid():
formset.save()
return render(request, 'staff_profile.html',{"formset": formset})

一个内联的formset不会让你改变模型之间的'line',所以你不能把'from_person'作为一个可变字段。在这种情况下,看起来你正在试图获得一个关注用户/请求者的人的列表('from_person'),并有可能改变他们,这样他们就不会再关注用户了。

内联格式集只是一种抽象——一种特定类型查询集的简写。您可以通过普通的格式集(如

)实现完全相同的效果。
AssignFriendsFormSet = modelformset_factory(Relationship, fields=('from_person', 'to_person'))
queryset = Relationship.objects.filter(from_person=user)
formset = AssignFriendsFormSet (
queryset=queryset,
)

多对多字段实际上只是through表中的一条记录,因此您可以在那里更新它。

最新更新