Множественный набор запросов к другой модели

#python #django #ninja

Вопрос:

Я пишу следующий код для поиска по категории в модели профиля с использованием платформы Django ninja, если я получаю только поля в профиле, все запросы возвращаются, но когда мне нужно получить имя пользователя из модели пользователя, из цикла возвращается только одна запись.

profile.py

 class Profile(models.Model):
    SERVICEPROVIDER = 'service_provider'
    CUSTOMER = 'customer'
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    conf_password = models.CharField(max_length= 124)
    category =  models.CharField(max_length= 80, blank=True, null=True)
    click = models.IntegerField(blank=True, default=0)
    date_clicked = models.DateTimeField(auto_now_add=True, blank=True,null=True)
    image_path = models.ImageField(upload_to='user_uploads/', blank=True)
    role = models.CharField(max_length=100, choices=[
        (SERVICEPROVIDER, SERVICEPROVIDER),
        (CUSTOMER, CUSTOMER),])
    
    profile_info = models.JSONField(blank=True, null=True)

    def __str__(self):
        return f'{self.user.username}'
 

auth.py

 @auth.get("/search/{category}", auth=None, response={200: searchSchemaout, 404: MessageOut})
def search(request, category:str):
    profile = Profile.objects.filter(category__icontains=category).values()
    for i in range(len(profile)):
        user = get_object_or_404(User,id=profile[i]['id'])
        return 200, {
            "user": user,
            "profile": profile[i]
        }

 

auth.py Схема

 class UserSchemaOut(Schema):
    username: str
    
class profileSchemaout(Schema):
    role: str
    category: str  

class searchSchemaout(Schema): 
    user: UserSchemaOut
    profile: profileSchemaout

 

Результат:

 {
  "user": {
    "username": "ahmed"
  },
  "profile": {
    "role": "service_provider",
    "category": "doors"
  }
}
 

Ответ №1:

Я нашел решение, может быть, это кому-то поможет

 @offices.get("/{category}/{user_id}", auth=None, response={200: List[searchSchemaout], 404: MessageOut})
def category(request, category:str):
    
    cat_qs = Profile.objects.all().filter(category__icontains=category)
    if cat_qs:
        return cat_qs
    else:
       return 404, {'message': 'This category not found.'} 
    
 

схема:

 class UserSchemaOut(Schema):
    pk: int
    username: str
    
class searchSchemaout(Schema): 
    user: UserSchemaOut
    category: str 
    image_path : str 
    role: str
    address: str