Запрос на соответствие модели Django не существует во вновь создаваемых экземплярах - PullRequest
0 голосов
/ 03 октября 2019

Итак, я видел один и тот же вопрос, опубликованный в разных сценариях, и я не могу заставить мой работать. В основном, пытаясь найти экземпляр модели, если он уже существует, и создать новый, если его нет - на основании того, что экземпляр имеет то же поле, что и имя пользователя пользователя

Я попытался получить get_object_or_404 и даже изменить первичный ключв поле в классе модели.

это - models.py

class Cart(models.Model):
    user = models.CharField(max_length=30)

    @classmethod
    def create(cls, user):
        user = cls(user=user)

        return user

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.id} {self.user}'

это - views.py

def cart(request, pk):
    try:
        pizza = PizzaInstance.objects.get(id=pk)
        # get the topping(s)
        topping_1 = int(request.POST["topping1"])
        topping = PizzaTopping.objects.get(pk=topping_1)
        # get the username
        user = request.user.username
        # check if the user already has an order
        try:
            order = Cart.objects.get(user=user)
        except KeyError:
            order = Cart.create([user])
            order.save()

создание пользователя

class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user

Я ожидалувидеть сохраненный заказ и создание нового экземпляра или даже добавление новых экземпляров в корзину.

ошибка: get is - Запрос на сопоставление корзины не существует.

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Есть несколько проблем:

  1. Вы должны получить пользователя с request.user вместо request.user.username (последний дает вам имя пользователя, которое str вместо User instance.
  2. На самом деле вы не должны создавать свои объекты с помощью пользовательского метода класса. Вместо этого используйте диспетчер объектов и вызовите Cart.objects.create(user=user) (а если вам do нужно сделатьпользовательская функция create(), она должна быть определена в пользовательском классе менеджера).

С этими изменениями вы сможете использовать Cart.objects.get_or_create(user=user), который возвращает кортеж, содержащий ваш объект Cart иbool, указывающий, был ли объект создан или нет (т. е. существовал в первую очередь).

Итак, вместе:

def cart(request, pk):
    try:
        pizza = PizzaInstance.objects.get(id=pk)
        # get the topping(s)
        topping_1 = int(request.POST["topping1"])
        topping = PizzaTopping.objects.get(pk=topping_1)

        # get the user
        user = request.user

        # get the Cart object associated with 'user' or create a new one
        order, created = Cart.objects.get_or_create(user=user)
1 голос
/ 03 октября 2019

Попробуйте использовать метод .get_or_create():

cart, created = Cart.objects.get_or_create(...)
0 голосов
/ 03 октября 2019

Вы делаете здесь некоторые странные вещи.

Cart.objects.get не вызовет ошибку KeyError. Возникает ошибка, которую вы видите: Cart.DoesNotExist. Так что это ошибка, которую вам нужно уловить.

Кроме того, по какой-то причине вы включаете user в список при передаче его в блок исключений. Не делай этого.

    try:
        order = Cart.objects.get(user=user)
    except Cart.DoesNotExist:
        order = Cart.create(user)
        order.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...