Django - get_or_create()的问题

时间:2016-10-03 18:21:48

标签: python django

我在视图中使用get_or_create()时遇到问题。 我想做的是让用户在想要添加关键字时获取或创建关键字模型的实例。

我有一个如下所示的关键字模型:

class Keyword(models.Model):
    word = models.CharField(max_length=30, unique=True, default=None)
    members = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, default=None)

    def __str__(self):
        return self.keywords

我有一个表单来创建关键字:

class KeywordForm(forms.ModelForm):
    keywords = forms.CharField(max_length=30)

    def __init__(self, *args, **kwargs):
        super(KeywordForm, self).__init__(*args, **kwargs)
        self.fields["keywords"].unique = False

    class Meta:
        fields = ("keywords",)
        model = models.Keyword

我在视图中尝试了不同的东西,这是我当前的版本,没有使用get_or_create。它只创建关键字:

class KeywordCreationView(LoginRequiredMixin, generic.CreateView):
    form_class = forms.KeywordForm
    model = models.Keyword
    page_title = 'Add a new keyword'
    success_url = reverse_lazy("home")
    template_name = "accounts/add_keyword.html"

    def form_valid(self, form):
        var = super(KeywordCreationView, self).form_valid(form)

        self.object.user = self.request.user
        self.object.save()
        self.object.members.add(self.object.user)

        return var

我的视图应如何查看以获取关键字(如果存在),如果存在,请将用户添加为'成员'。如果没有,请创建关键字。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我相信CreateView并不适合这个类。您应该使用This previous question points out how to do IPC in NodeJS.来覆盖此基于类的视图的UpdateView方法(实际上是SingleObjectMixin的一部分)祖先。

这个mixin的get_object相当令人垂涎,但在你的情况下,就像

一样简单
def get_object(self, queryset=None):
    pk = self.kwargs.get(self.pk_url_kwarg)
    if queryset:
        obj, c = queryset.get_or_create(pk=pk)

    else:
        obj, c = MyModel.get_or_create(pk=pk)

    return obj

可能会奏效。但坦率地说,使用简单的(非基于类的视图)

更简单