Django ORM正在寻找一个我从未创建过的专栏

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

我正试图用django从外部数据库中提取数据。我使用inspectdb命令获取模型,该数据库有两个表,当我尝试从第一个表获取数据时,它可以工作…但当我尝试从第二个表获取数据时,会抛出下一个错误:

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
类型。