Django ORM正在寻找一个我从未创建过的专栏
我正试图用django从外部数据库中提取数据。我使用inspectdb命令获取模型,该数据库有两个表,当我尝试从第一个表获取数据时,它可以工作…但当我尝试从第二个表获取数据时,会抛出下一个错误:Django ORM正在寻找一个我从未创建过的专栏,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我正试图用django从外部数据库中提取数据。我使用inspectdb命令获取模型,该数据库有两个表,当我尝试从第一个表获取数据时,它可以工作…但当我尝试从第二个表获取数据时,会抛出下一个错误: 1054, "Unknown column 'hotel_reviews.id' in 'field list'" 列id不存在且正确,但为什么要查找它 我就是这样得到这些模型的: from django.db import models class HotelInfo(mod
1054, "Unknown column 'hotel_reviews.id' in 'field list'"
列id不存在且正确,但为什么要查找它
我就是这样得到这些模型的:
from django.db import models
class HotelInfo(models.Model):
country_area = models.CharField(max_length=45)
hotel_id = models.CharField(primary_key=True, max_length=32)
hotel_name = models.TextField(blank=True, null=True)
hotel_url = models.TextField(blank=True, null=True)
hotel_address = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_qty = models.IntegerField(blank=True, null=True)
clean = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
comf = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
loct = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
fclt = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
staff = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
vfm = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
wifi = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_info'
unique_together = (('hotel_id', 'country_area'),)
verbose_name_plural = "hotels"
class HotelReviews(models.Model):
uuid = models.CharField(db_column='UUID', max_length=36, blank=True, null=True) # Field name made lowercase.
hotel_id = models.CharField(max_length=32, blank=True, null=True)
review_title = models.TextField(blank=True, null=True)
review_url = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_date = models.DateField(blank=True, null=True)
reviewer_name = models.TextField(blank=True, null=True)
hash_reviewer_name = models.CharField(max_length=200, blank=True, null=True)
reviewer_location = models.CharField(max_length=100, blank=True, null=True)
posting_conts = models.IntegerField(blank=True, null=True)
positive_content = models.TextField(blank=True, null=True)
negative_content = models.TextField(blank=True, null=True)
tag_n1 = models.TextField(blank=True, null=True)
tag_n2 = models.TextField(blank=True, null=True)
tag_n3 = models.TextField(blank=True, null=True)
tag_n4 = models.TextField(blank=True, null=True)
tag_n4 = models.TextField(blank=True, null=True)
tag_n5 = models.TextField(blank=True, null=True)
staydate = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_reviews'
verbose_name_plural = "Reviews"
然后我创建序列化程序,如下所示:
from rest_framework import serializers
from .models import HotelInfo
from .models import HotelReviews
class HotelInfoSerializer(serializers.ModelSerializer):
class Meta:
model = HotelInfo
fields = '__all__'
class HotelReviewSerializer(serializers.ModelSerializer):
class Meta:
model = HotelReviews
fields = '__all__'
这就是我的观点:
from rest_framework import viewsets
from .models import HotelInfo
from .models import HotelReviews
from .serializer import HotelInfoSerializer
from .serializer import HotelReviewSerializer
class HotelInfoViewSet(viewsets.ModelViewSet):
queryset = HotelInfo.objects.filter(review_qty__gte=5)
serializer_class = HotelInfoSerializer
class HotelReviewsViewSet(viewsets.ModelViewSet):
queryset = HotelReviews.objects.all()
serializer_class = HotelReviewSerializer
这是URL:
rom rest_framework import viewsets
from .models import HotelInfo
from .models import HotelReviews
from .serializer import HotelInfoSerializer
from .serializer import HotelReviewSerializer
class HotelInfoViewSet(viewsets.ModelViewSet):
queryset = HotelInfo.objects.filter(review_qty__gte=5)
serializer_class = HotelInfoSerializer
class HotelReviewsViewSet(viewsets.ModelViewSet):
queryset = HotelReviews.objects.all()
serializer_class = HotelReviewSerializer
正如我所说的,第一个表(hotel_info)有效,但第二个表(hotel_review)在我尝试获取数据时抛出错误。有人能帮我吗?如果您不使用
primary\u key=True
指定字段,Django将隐式创建一个字段。此字段名为id
,是一个自动字段
。由于您的HotelReviews
模型没有指定主键字段,因此它将为该模型指定主键字段
因此,您应该在此处将uuid
指定为主键:
class HotelReviews(models.Model):
uuid = models.CharField(
primary_key=True,
db_column='UUID',
max_length=36,
blank=True
)
# …
class Meta:
managed = False
db_table = 'hotel_reviews'
verbose_name_plural = 'Reviews'
class HotelReviews(models.Model):
uuid=models.CharField(
主键=真,
db_column='UUID',
最大长度=36,
空白=真
)
# …
类元:
托管=错误
db_表='hotel_reviews'
详细名称复数=‘评论’
注意:Django有一个 指定通用唯一标识符。此字段还具有验证器,用于检查uuid是否具有正确的 格式,因此通常更好
如果未指定主键列,则会隐式创建
id
。因此,由于您的HotelReviews
模型不包含带有primary\u键的字段,因此True
,Django假设您隐式创建了一个名为id
的字段。有没有办法在不使用主键的情况下不创建该字段?但是您有一个uuid
字段,因此可以将其用作主键。确切地说,为什么不将uuid
作为主键。它不会改变数据库端的任何内容。顺便问一下,uuid
为什么是null=True
?可为NULL的字段通常很少出现,尤其是因为它们使视图中的逻辑等变得更加复杂。因为现在项可以是字符串或None
类型。