python - "查询集没有属性" 但我没有进行任何字段查找
问题描述
在 Django 中,我filter
用来返回一个查询集,以便我可以在我的序列化程序中更新它。问题是我得到这个错误:'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')
. 但我不确定为什么它表现得好像我仍在尝试对查询集进行字段查找
序列化程序.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)
模型.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")
解决方案
您的问题在于该return lookup
行 - 这仍然是一个QuerySet
而不是模型实例,而如果您的过滤器没有匹配,您将返回一个ShoppingList
模型实例。因此,如果该返回值的消费者期望一个模型实例,您将得到这种异常。一种解决方法是返回lookup[0]
,因为您已经确保它是非空的。
您也许还可以使用update_or_create便捷方法 - 放入vin=vin, run_date=run_date, check=check
查询 kwargs 和arg 中validated_data
。defaults
推荐阅读
- ssis - SSIS 面临身份验证失败,因为远程方已关闭传输流-异常
- android - 在寻找匹配的'''时猛击意外的EOF
- shopify - 如何使用 Shopify API 创建结帐
- php - 请求缺少所需的身份验证凭据。预期要刷新的 OAuth 2 访问令牌、登录 cookie 或其他有效身份验证凭据
- linux - echo $(filename) 和 cat 文件名有什么区别?
- amazon-web-services - 如何在 aws 平台上查看 rhel 订阅率?
- c - 如何将 unsigned long int 转换为 char 以在 C 中的 LCD 上显示
- android - 我有一个chipGroup,我也为它创建了一个自定义样式
- javascript - 导航栏在移动模式下覆盖我的文本
- python - 为什么每次我调用 shap.plots.beeswarm 时 shap 值都会发生变化?