繁体   English   中英

Django - get_or_create()的问题

[英]Django - Problems with get_or_create()

我在视图中使用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

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

谢谢你的帮助!

我相信CreateView不适合这个。 您应该使用UpdateView并覆盖此基于类的视图的get_object方法(实际上是SingleObjectMixin的一部分)的祖先。

这个mixin的源代码相当令人垂涎,但在你的情况下,就像这样简单

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM