gpt4 book ai didi

python - Django 管理多对多子集

转载 作者:太空宇宙 更新时间:2023-11-03 18:28:10 25 4
gpt4 key购买 nike

我正在尝试在 Django admin 中集成接下来的三个相关模型:

# models.py
class Seminar(models.Model):
title = models.CharField(max_length=128, unique=True)
start_date = models.DateField(db_index=True)
end_date = models.DateField(db_index=True)


class Event(models.Model):
title = models.CharField(max_length=128)
start_date = models.DateTimeField(db_index=True)
end_date = models.DateTimeField(db_index=True)
seminar = models.ForeignKey('Seminar')


class Registration(models.Model):
name = models.CharField(max_length=128)
first_name = models.CharField(max_length=128)
seminar = models.ForeignKey('Seminar')
events = models.ManyToManyField('Event', null=True)


# admin.py
class EventInline(admin.TabularInline):
model = Event


class SeminarAdmin(admin.ModelAdmin):
list_display = ('title', 'start_date', 'end_date')
inlines = [
EventInline,
]


class RegistrationAdmin(admin.ModelAdmin):
list_display = ('seminar', 'name', 'first_name')

如您所见,每个研讨会可能有多个事件,从研讨会管理员添加为内联条目。

我的问题是注册,因为它们是:

  • 与研讨会相关
  • 可以“订阅”本次研讨会的多项事件

当然,管理员列出了所有事件,而不是与研讨会相关的子集,因此:

  • 是否可以通过管理员来实现此目的(调整尽可能少)?
  • 事件上的注册 M2M 是否合适,或者我应该以不同的方式关联这两个模型?

谢谢!

最佳答案

好吧,就在在这里提问之前,我做了一些类似于 Django 的 auth.User 的事情。通过使用不同的表单来添加/更改 View 来建模。我希望有更好的解决方案,显然没有。

所以这就是我所做的:

# models.py
class Registration(models.Model):
# [...] - add form excludes it, should allow blank on events field
events = models.ManyToManyField('Event', blank=True, null=True)


# admin.py
class RegistrationAdmin(admin.ModelAdmin):
change_form = RegistrationChangeForm

def get_form(self, request, obj=None, **kwargs):
defaults = {}
if obj is None:
defaults.update(exclude=('events',))
else:
defaults.update(form=self.change_form)
defaults.update(kwargs)
return super(RegistrationAdmin, self).get_form(request, obj, **defaults)


# forms.py
class RegistrationChangeForm(forms.ModelForm):
class Meta:
model = Registration
exclude = ('seminar',)

def __init__(self, *args, **kwargs):
super(RegistrationChangeForm, self).__init__(*args, **kwargs)
self.fields['events'].choices = Event.objects.filter(seminar=kwargs.get('instance').seminar).values_list('pk','title')

因此,在添加时,我们只需忽略事件(注册与空事件一起保存),然后,在更改时,可以根据先前定义的研讨会选择事件列表,然后忽略该列表(因为我们无法重新加载相关的事件)事件列表)。

关于python - Django 管理多对多子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com