Pontos de conhecimento relacionados ao modelo de dados do Django

Como definir a chave estrangeira do banco de dados

passar

models.ForeignKey("目标模型名如TestModel", on_delete=models.CASCADE, verbose_name="后台管理显示的名称")

O atributo on_delete é usado para controlar se os dados são excluídos quando a chave estrangeira é excluída.

Atributos efeito
modelos.CASCADE Após a exclusão do link externo, o registro será excluído de forma síncrona
modelos.PROTEGER O registro não será excluído após a exclusão do link externo
modelos.SET_NULL Após a exclusão do link externo, este campo é definido como vazio, desde que blank=True, null=True seja definido no modelo
modelos.SET_DEFAULT Após a exclusão do link externo, este campo é substituído pelo valor padrão, que deve ser definido quando o modelo é criado

Simplifique os resultados da consulta de dados

Em geral, as consultas de link externo retornam um Queryset e, em seguida, continuam a obter dados de link externo do Queryset.Em Python, o decorador @property pode ser usado para obter dados relacionados.

class GoodsSKU(BaseModel):
    """商品SKU表,用于保存商品具体信息"""
    status_choices = (
        (0, "下线"),
        (1, "上线"),
    )
    type = models.ForeignKey("GoodsType",blank=True, null=True, on_delete=models.SET_NULL, verbose_name="商品种类")
    goods = models.ForeignKey("GoodsSPU",blank=True, null=True, on_delete=models.SET_NULL, verbose_name="商品SPU")
    name = models.CharField(max_length=20, verbose_name="商品名称")
    desc = models.CharField(max_length=256, verbose_name="商品简介")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品价格")
    unite = models.CharField(max_length=20, verbose_name="商品单位")
    image = models.ImageField(upload_to="upload/goods", verbose_name="商品图片")
    stock = models.IntegerField(default=1, verbose_name="商品库存")
    sales = models.IntegerField(default=0, verbose_name="商品销量")
    status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name="商品状态")
    
    class Meta:
        db_table = "goods_sku"
        verbose_name = "商品SKU"
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return self.name
    
class Banner(BaseModel):
    priority = models.IntegerField(default=0, verbose_name="优先级")
    goodsku = models.ForeignKey("GoodsSKU", on_delete=models.CASCADE, verbose_name="商品SKU")
    
    class Meta:
        db_table = "banner"
        ordering = ["update_time", "-id"]
        verbose_name = "轮播图"
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return self.goodsku.name
    
    @property
    def info(self):
        """用于返回轮播图相关信息"""
        good = self.goodsku
        return {
    
    'id':good.id, 'image':good.image.url, 'name':good.name}

Os dois modelos acima são: o modelo de SKU do produto e o modelo de banner do carrossel da página inicial. O carrossel precisa fornecer o link da imagem e o nome do produto. Você pode usar o decorador @property para retornar diretamente os resultados necessários. Os resultados retornados são :

{
    
    'id': 1, 'image': '/media/upload/goods/1.jpg', 'name': '美果汇红肉西柚4枚礼盒 葡萄柚柚子'}

É conveniente para nós passar diretamente os dados correspondentes para a página de modelo na função de exibição.

O sistema de autenticação do usuário que vem com o django.contrib.auth

No uso real do site, funções como login e registro do usuário são frequentemente necessárias. Django projetou uma classe User comum, que pode atender às necessidades gerais de informações do usuário e pode ser usada herdando diretamente a classe User.

class User(AbstractUser):
    """用户模型类"""
    class Meta:
        # 指定数据库表为user表
        db_table = "user"
        verbose_name = "用户"
        verbose_name_plural = verbose_name

Depois de sincronizar o banco de dados com sucesso, você pode ver o conteúdo do campo correspondente na tabela de usuários do banco de dados.Você
insira a descrição da imagem aqui
Estrutura da tabela
pode ver que a autoridade do administrador e o status de ativação do usuário são controlados por is_staff e is_active, respectivamente.
usar

django-admin.exe createsuperuser

Na interface subseqüente, digite a senha da conta do superusuário para criar uma conta de administrador e gerencie todo o conteúdo do modelo na interface de gerenciamento em segundo plano de localhost:8000/admin.

Depois de criar o modelo de usuário e o superadministrador, você pode consultar o conteúdo do usuário criado e verificar a senha.

>>> from user.models import User
>>> User.objects.all()
<QuerySet [<User: admin>]>
>>> User.objects.all()[0] 
<User: admin>
>>> User.objects.all()[0].get_username
<bound method AbstractBaseUser.get_username of <User: admin>>
>>> User.objects.all()[0].get_username()
'admin'
>>> User.objects.all()[0].check_password('admin')
True
>>> User.objects.all()[0].check_password('123')   
False

Todas as informações do usuário podem ser obtidas por meio do método all(). Há apenas uma conta de administrador aqui, portanto, as informações da conta de administrador podem ser obtidas diretamente por assinatura. Após a aquisição bem-sucedida, as informações do nome de usuário do objeto retornado podem ser obtidas por meio do get_username(), ou Verifique a senha digitada pelo usuário através do método check_password().

>>> User.objects.filter(username='admin')      
<QuerySet [<User: admin>]>
>>> User.objects.filter(username='admin')[0] 
<User: admin>
>>> User.objects.filter(username='123')     
<QuerySet []>
>>> User.objects.get(username='admin') 
<User: admin>
>>> User.objects.get(username='a')     
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\TOM\.virtualenvs\Django\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\TOM\.virtualenvs\Django\lib\site-packages\django\db\models\query.py", line 496, in get
    raise self.model.DoesNotExist(
user.models.User.DoesNotExist: User matching query does not exist.

Em circunstâncias normais, quando há vários usuários na tabela de dados, a função filter() é usada para realizar uma consulta condicional no banco de dados. A condição de consulta usada aqui é username='admin', ou seja, para encontrar as informações da conta com o nome de usuário admin. Como o It retornado é um QuerSet, você precisa obter o objeto de consulta subscrevendo. Se você puder determinar que há apenas um objeto elegível na tabela, poderá usar a função get() para consultar e retornar o objeto consultado diretamente. Quando a função get() não consegue encontrar o objeto correspondente, ela lançará um erro DoesNotExist, que pode ser obtido através da captura de exceção.

operação em lote

O modelo ORM do Django suporta operações em lote através da função in_bulk

# 函数使用方法
in_bulk(id_list=None, *, field_name='pk')
# Django 示例
>>> Blog.objects.in_bulk([1, 2])
{
    
    1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}

Por padrão, um objeto iterável é passado e será pesquisado na coluna id. Você também pode usar field_name para especificar a coluna a ser pesquisada. O valor de retorno é um dicionário. O valor da chave é o elemento correspondente na entrada lista e o valor value é um objeto de modelo operável

Acho que você gosta

Origin blog.csdn.net/qq_20728575/article/details/125306549
Recomendado
Clasificación