«Набор запросов не имеет атрибута <field>», но я не выполняю поиск по полю - PullRequest
0 голосов
/ 23 мая 2019

В Django я использую filter, чтобы вернуть Queryset, чтобы я мог обновить его в моем сериализаторе. Проблема в том, что я получаю эту ошибку: 'QuerySet' object has no attribute 'vin'. Я понимаю, что ошибка возникает при попытке поиска поля в Queryset, и в этом случае вы бы использовали get() вместо filter(), но я не делаю поиск поля. И моя база данных обновляется , как и предполагалось, но я получаю ошибку независимо. документы используют его так же: # Update all the headlines with pub_date in 2007. Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same'). Но я не уверен, почему он действует так, как будто я все еще пытаюсь выполнить поиск поля в наборе запросов

serializers.py

class ShoppingListSerializer(serializers.ModelSerializer):
    class Meta:
        model = ShoppingList
        fields = ('vin', 'img_url', 'year', 'make', 'model', 'grade',
                  'colour', 'MMR', 'run_date', 'timestamp', 'lane', "trim",
                  "mileage", 'human_valuation', 'run_no', 'adesa_id', 'engine',
                  'transmission', 'wheel_drive', 'interior_color', 'seller_announcements',
                  'auction_location', 'extra', 'check')

    def create(self, validated_data):
        # look up the supplied vin, rundate and check fields before POSTing
        # if the instance exists then just update

        vin = validated_data["vin"]
        run_date = validated_data["run_date"]
        check = validated_data["check"]

        lookup = ShoppingList.objects.filter(vin=vin, run_date=run_date, check=check)

        # if lookup exists then update that instance instead
        if lookup:
            print("Updating old record")
            lookup.update(**validated_data)
            print(lookup)
            return lookup

        return ShoppingList.objects.create(**validated_data)

models.py

class ShoppingList(models.Model):
    vin = models.CharField(max_length=20)
    img_url = models.URLField(blank=True)
    year = models.CharField(max_length=20, default="Check Online")
    make = models.CharField(max_length=20, default="Check Online")
    model = models.CharField(max_length=20, default="Check Online")
    grade = models.CharField(max_length=20, default="Check Online")
    colour = models.CharField(max_length=20, default="Check Online")
    MMR = models.TextField(default="n/a")
    check = models.TextField(default="n/a")
    run_date = models.CharField(max_length=20, default="Check Online")
    timestamp = models.DateTimeField(auto_now=True)  # updated timestamp
    lane = models.CharField(max_length=10, default="Check Online")
    trim = models.CharField(max_length=60, default="Check Online")
    mileage = models.CharField(max_length=20, default="Check Online")
    human_valuation = models.TextField(default="0")
    run_no = models.CharField(max_length=20, default="Check Online")
    adesa_id = models.CharField(max_length=20, default="n/a")
    engine = models.TextField(default="n/a")
    transmission = models.TextField(default="n/a")
    wheel_drive = models.CharField(max_length=50, default="n/a")
    interior_color = models.CharField(max_length=50, default="n/a")
    seller_announcements = models.TextField(default="n/a")
    auction_location = models.CharField(max_length=50, default="n/a")
    extra = models.TextField(default="n/a")

1 Ответ

1 голос
/ 23 мая 2019

Ваша проблема со строкой return lookup - это все еще QuerySet, а не экземпляр модели, тогда как если ваш фильтр не получает совпадений, вы возвращаете один экземпляр ShoppingList модели.Поэтому, если потребители этого возвращаемого значения ожидают экземпляра модели, вы получите такое исключение.Одно из исправлений - вместо этого вернуть lookup[0], поскольку вы уже убедились, что оно не пустое.

Вы также можете использовать вспомогательный метод update_or_create - put vin=vin, run_date=run_date, check=checkв запросе kwargs и validated_data в defaults arg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...