0
不知道我是否應該將其分成單獨的帖子,我必須基本上覆制粘貼每個問題的整個代碼。我希望這很好。Django模型與額外的領域,許多tomanyfield每個對象的權限 - 我做對了嗎?
我有我的應用程序中的渠道。每個用戶可以對每個頻道具有不同的訪問級別。我需要能夠查詢用戶可以閱讀的每個頻道的條目。我已經將它實現爲ManyToManyField,是否有更好的解決方案?
在我的許可模式中,我有
ForeignKey(User, blank=True, null=True)
和unique_together = ("channel", "user")
。我使用帶有空用戶字段的權限對象來存儲未指定用戶的默認訪問級別。這會使我陷入麻煩嗎? (null!= null on database level)我想在ChannelCreateForm中設置默認訪問級別,所以我添加了額外的字段並覆蓋了相關視圖的form_valid方法。有沒有更適當的方法來做到這一點?
我有點兒在這裏即興創作。請指出您在我的代碼中找到的任何醜陋。那就是:
class Channel(models.Model): name = models.CharField(max_length=30, unique=True) title = models.CharField(max_length=70, blank=True, null=True) description = models.TextField(blank=True, null=True) owner = models.ForeignKey(User) permission = models.ManyToManyField(User, through='ChannelPermission', related_name="permission") class ChannelPermission(models.Model): PERM_CHOICES = ( (0, 'none'), (1, 'read'), (2, 'post'), (3, 'edit'), (4, 'lock'), (5, 'manage'), ) channel = models.ForeignKey(Channel) user = models.ForeignKey(User, blank=True, null=True) access = models.IntegerField(choices=PERM_CHOICES, default=0) class Meta: unique_together = ("channel", "user") class ChannelCreateForm(forms.ModelForm): access = forms.ChoiceField(label = 'Default access', choices = ( (0, 'none'), (1, 'read'), (2, 'post'), (3, 'edit'), ) ) class Meta: model = Channel fields = ['name', 'title', 'access', 'description'] class ChannelCreate(CreateView): form_class = ChannelCreateForm template_name = 'index_form.html' def form_valid(self, form): obj = form.save(commit=False) obj.owner = self.request.user obj.save() perm = ChannelPermission(user=None, channel=obj, access=form.cleaned_data['access']) perm.save() return HttpResponseRedirect(reverse('some_name'))
2.我主要是擔心unique_together 「不工作」 空值。你說模型,但你的代碼說的形式。 ;]是的,將它放在表單代碼中更有意義。謝謝。 – petr0
在這種情況下,您應該從ChannelPermission中爲用戶刪除null = True,blank = True,並在Channel模型中創建另一個名爲default_permission的字段 –