#python #django #django-models #backend #web-frameworks
Вопрос:
Я пытаюсь создать новостной сайт с помощью django, и в структуре данных шаблона, которую я получил на интерфейсе, есть специальная страница сведений об авторе. В бэкэнде мне нужно преобразовать эту авторскую часть в API и интегрировать ее на сайт, но код, который я написал, работает неправильно (я могу добавить одного автора, но когда я пытаюсь добавить второго, я получаю УНИКАЛЬНОЕ ограничение failed post_author.ошибка href.) Как, по-вашему, я должен следовать и какую структуру я должен создать?
Это мой код модели
from django.db import models from django.contrib.contenttypes.models import ContentType from django.db import models from django.urls import reverse #from comments.models import Comment from .utils import get_read_time from django.conf import settings from django.utils import timezone from markdown_deux import markdown from django.utils.text import slugify from django.contrib.auth.models import User from django.db.models.signals import pre_save from django.utils.safestring import mark_safe import uuid # from user_info.models import Profile class GENDER(models.TextChoices): Erkek = "Erkek" Kadın = "Kadın" Diğer = "Diğer" NONE = "Belirtmek İstemiyorum" class Category_Choices(models.TextChoices): BİLİNMEYENLER = '13İlinmeyenler' KİŞİSEL_GELİŞİM = 'Kişisel Gelişim' İLHAM_AL = 'İlham Al' YATIRIM_HABERLERİ = 'Yatırım Haberleri' GİRİŞİMCİLİK = 'Girişimcilik' ENGLİSH_NEWS = 'English News' BAŞARI_HİKAYELERİ = "Başarı Hikayeleri" class Color_Choices(models.TextChoices): INDIGO = 'indigo' green = 'green' yellow = 'yellow' RED = 'red' blue = 'blue' gray = 'gray' pink = "pink" class Author(models.Model): author = models.OneToOneField(User, on_delete = models.CASCADE) firstName = models.CharField(max_length=80) lastName = models.CharField(max_length=80) email = models.EmailField(null=True,blank=True) displayName = models.CharField(max_length=100) href = models.SlugField(editable=False,unique=True) gender = models.TextField(blank=False,choices=GENDER.choices) avatar = models.ImageField(upload_to="avatar") desc = models.TextField() jobName = models.CharField(default="Yazar",max_length=30) bgImage = models.ImageField(null=True, blank=True, upload_to="background") def __str__(self): return self.displayName def get_slug(self): href = slugify(self.firstName.replace("ı","i")) unique = href number = 1 while Author.objects.filter(href=unique).exists(): unique = "{}-{}" .format(href,number) number = 1 return unique def pre_save_receiver(sender, instance, *args, **kwargs): if not instance.href and instance.firstName: if not Author.objects.filter(href=slugify(instance.firstName)).exists(): instance.href = slugify(instance.firstName) else: instance.href = slugify(instance.firstName) str(uuid.uuid4())[:8] class Categories(models.Model): name = models.CharField(max_length=50,choices=Category_Choices.choices,default=Category_Choices.BİLİNMEYENLER) color = models.CharField(max_length=30,choices=Color_Choices.choices, default=Color_Choices.RED) href = models.SlugField(editable=False) thumbnail = models.ImageField(upload_to="postpost",null=True,blank=True) def __str__(self): return self.name def get_category_slug(self): slug = slugify(self.name.replace("ı","i")) unique = slug number = 1 while Categories.objects.filter(slug=unique).exists(): unique = "{}-{}" .format(slug,number) number = 1 return unique def save(self, *args, **kwargs): self.href = slugify(self.name) super(Categories,self).save(*args, **kwargs) def get_absolute_url(self): return self.href class Post(models.Model): authorId = models.ForeignKey(Author, on_delete=models.CASCADE) title = models.CharField(max_length=255, unique=True) desc = models.CharField(max_length=255) categoryID = models.ForeignKey(Categories,on_delete=models.CASCADE,) content = models.TextField(blank=False) href = models.SlugField(editable=False,unique=True) draft = models.BooleanField(default=True) readingtime = models.IntegerField(default=0) updated = models.DateTimeField() date = models.DateTimeField(editable=False,null=True) published = models.DateField(default=timezone.now) featuredimage = models.ImageField(null=True, blank=True, upload_to='post') class Meta: ordering = ['-date', '-updated'] def __str__(self): return self.title def get_slug(self): slug = slugify(self.title.replace("ı","i")) unique = slug number = 1 while Post.objects.filter(slug=unique).exists(): unique = "{}-{}" .format(slug,number) number = 1 return unique #@property #def comments(self): # instance = self # qs = Comment.objects.filter_by_instance(instance) # return qs def get_markdown(self): content = self.content markdown_text = markdown(content) return mark_safe(markdown_text) def pre_save_receiver(sender, instance, *args, **kwargs): if not instance.href and instance.title: if not Post.objects.filter(href=slugify(instance.title)).exists(): instance.href = slugify(instance.title) else: instance.href = slugify(instance.title) str(uuid.uuid4())[:8] def pre_save_receiver(sender, instance, *args, **kwargs): if not instance.href and instance.firstName: if not Author.objects.filter(href=slugify(instance.firstName)).exists(): instance.href = slugify(instance.firstName) else: instance.href = slugify(instance.firstName) str(uuid.uuid4())[:8] pre_save.connect(pre_save_receiver, sender=Post) pre_save.connect(pre_save_receiver, sender=Author)
и это json-версия структуры таблицы, которую я хочу создать
{ "id": 4, "firstName": "Aşkın Nur", "lastName": "Ersoy", "displayName": "Aşkın Nur Ersoy", "email": "afalconar3@google.ru", "gender": "Non-binary", "avatar": "https://robohash.org/corruptiliberolabore.png?size=150x150amp;set=set1", "count": 36, "href": "/author/the-demo-author-slug", "desc": "There’s no stopping the tech giant. Apple now opens its 100th store in China.There’s no stopping the tech giant.", "jobName": "Author Job", "bgImage": "https://images.pexels.com/photos/4064835/pexels-photo-4064835.jpeg?auto=compressamp;cs=tinysrgbamp;dpr=2amp;h=750amp;w=1260" },
Комментарии:
1. В вашей модели , которая у вас есть
href = models.SlugField(editable=False,unique=True)
, это означает, чтоhref
она будет отличаться для всех объектов. Но в ваших данных json вы"href": "/author/the-demo-author-slug"
уверены, что это значение уникально для всех данных ?2. Я создам сайт с подробной страницей для каждого из сообщений и подробной страницей для каждого из авторов. Шаблон, который я купил, в настоящее время заполнен только статическим демонстрационным контентом, и вместо этого я создам структуру, создав динамические ссылки в этом разделе href. И да, я уверен, что это уникальная ценность.
3. Я создам сайт с подробной страницей для каждого из сообщений и подробной страницей для каждого из авторов. Шаблон, который я купил, в настоящее время заполнен только статическим демонстрационным контентом, и вместо этого я создам структуру, создав динамические ссылки в этом разделе href. И да, я уверен, что это уникальная ценность.