簡體   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