Points de connaissance liés au modèle de données Django

Comment définir la clé étrangère de la base de données

passer

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

L'attribut on_delete est utilisé pour gérer si les données sont supprimées lorsque la clé étrangère est supprimée.

Les attributs effet
modèles.CASCADE Une fois le lien externe supprimé, l'enregistrement sera supprimé de manière synchrone
modèles.PROTECT L'enregistrement ne sera pas supprimé après la suppression du lien externe
modèles.SET_NULL Une fois le lien externe supprimé, ce champ est défini sur vide, à condition que blank=True, null=True soit défini dans le modèle
modèles.SET_DEFAULT Une fois le lien externe supprimé, ce champ est remplacé par la valeur par défaut, qui doit être définie lors de la création du modèle

Simplifier les résultats des requêtes de données

En général, les requêtes de liens externes renvoient un ensemble de requêtes, puis continuent d'obtenir des données de liens externes à partir de l'ensemble de requêtes. En Python, le décorateur @property peut être utilisé pour obtenir des données associées.

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}

Ce qui précède sont deux modèles, à savoir le modèle SKU de produit et le modèle de bannière de carrousel de page d'accueil. Le carrousel doit fournir le lien d'image et le nom du produit. Vous pouvez utiliser le décorateur @property pour renvoyer directement les résultats requis. Les résultats renvoyés sont :

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

Il est pratique pour nous de transmettre directement les données correspondantes dans la page de modèle dans la fonction d'affichage.

Le propre système d'authentification des utilisateurs de Django.contrib.auth

Dans l'utilisation réelle du site Web, des fonctions telles que la connexion et l'enregistrement de l'utilisateur sont souvent nécessaires. Django a conçu une classe User commune, qui peut répondre aux besoins généraux d'informations de l'utilisateur et peut être utilisée en héritant directement de la classe User.

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

Après avoir synchronisé avec succès la base de données, vous pouvez voir le contenu du champ correspondant dans la table des utilisateurs de la base de données.
insérez la description de l'image ici
Structure du tableau
Vous pouvez voir que l'autorité de l'administrateur et le statut d'activation de l'utilisateur sont contrôlés respectivement par is_staff et is_active.
utiliser

django-admin.exe createsuperuser

Dans l'interface suivante, entrez le mot de passe du compte du super utilisateur pour créer un compte administrateur et gérez tout le contenu du modèle dans l'interface de gestion en arrière-plan de localhost:8000/admin.

Après avoir créé le modèle d'utilisateur et le super administrateur, vous pouvez interroger le contenu de l'utilisateur créé et vérifier le mot de passe.

>>> 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

Toutes les informations sur l'utilisateur peuvent être obtenues via la méthode all(). Il n'y a qu'un seul compte administrateur ici, de sorte que les informations du compte administrateur peuvent être directement obtenues par abonnement. Une fois l'acquisition réussie, les informations sur le nom d'utilisateur de l'objet renvoyé peuvent être obtenues via la get_username(), ou Vérifiez le mot de passe saisi par l'utilisateur via la méthode 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.

Dans des circonstances normales, lorsqu'il y a plusieurs utilisateurs dans la table de données, la fonction filter() est utilisée pour effectuer une requête conditionnelle sur la base de données. La condition de requête utilisée ici est username='admin', c'est-à-dire pour trouver les informations de compte avec le nom d'utilisateur admin. Étant donné qu'il s'agit d'un QuerSet, vous devez obtenir l'objet de requête en inscrivant. Si vous pouvez déterminer qu'il n'y a qu'un seul objet éligible dans la table, vous pouvez utiliser la fonction get() pour interroger et renvoie directement l'objet recherché. Lorsque la fonction get() ne peut pas trouver l'objet correspondant, elle génère une erreur DoesNotExist, qui peut être obtenue via la capture d'exception.

opération par lots

Le modèle ORM de Django prend en charge les opérations par lots via la fonction 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>}

Par défaut, un objet itérable est transmis et il sera recherché dans la colonne id. Vous pouvez également utiliser field_name pour spécifier la colonne à rechercher. La valeur de retour est un dictionnaire. La valeur clé est l'élément correspondant dans le champ entrant list, et la valeur value est un objet de modèle utilisable

Je suppose que tu aimes

Origine blog.csdn.net/qq_20728575/article/details/125306549
conseillé
Classement