2016-11-03 4 views
0

관련 모델의 필드와 관련된 필드를 어떻게 만들 수 있습니까? 두 가지 모델이 있습니다. 앨범과 사진, 앨범 모델은 부울 필드 private입니다. 사진에 private 필드를 만드는 방법입니다. 앨범 필드가 없음 인 경우 False 값을 가지며 앨범 개인 필드 값이 아닌 경우 값을 갖습니다.관련 개체의 필드와 관련된 필드 Django

는 models.py : @RodXavier으로

from django.db import models 
from django.contrib.auth.models import User 
import os 
import uuid 

def get_image_path(instance, filename): 
    return '{}.{}'.format(uuid.uuid4(), filename.split('.')[-1]) 


class Album(models.Model): 
    user = models.ForeignKey(User, related_name='albums', on_delete=models.CASCADE) 
    title = models.CharField(max_length=80, default='New album') 
    creation_date = models.DateField(auto_now_add=True) 
    private = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 

    class Meta: 
     ordering = ['-creation_date', ] 

class Photo(models.Model): 
    user = models.ForeignKey(User, related_name='photos', on_delete=models.CASCADE) 
    album = models.ForeignKey(Album, related_name='photos', on_delete=models.CASCADE, null=True, blank=True) 
    title = models.CharField(max_length=80, default='New photo') 
    image = models.ImageField(title, upload_to=get_image_path) 
    creation_date = models.DateField(auto_now_add=True) 
    # ??? 
    private = models.BooleanField() 
    # ??? 

    def __str__(self): 
     return self.title 

    class Meta: 
     ordering = ['-creation_date', ] 
+1

방금 ​​앨범의 개인 필드에 의존하는 속성을 추가 할 수 없습니다 사용했다? –

답변

0

는 속성이

class Photo(models.Model): 
    user = models.ForeignKey(User, related_name='photos', on_delete=models.CASCADE) 
    album = models.ForeignKey(Album, related_name='photos', on_delete=models.CASCADE, null=True, blank=True) 
    title = models.CharField(max_length=80, default='New photo') 
    image = models.ImageField(title, upload_to=get_image_path) 
    creation_date = models.DateField(auto_now_add=True) 

    @property 
    def private(self): 
     return getattr(self, 'album', False) 
+0

하지만이 방법으로 필터를 사용할 수 없습니다. – Rodion

+0

@Robin 예. 당신은 할 수 없습니다. 조회 및 필터링 모두에서 작동하는 하나의 솔루션이 있습니다.이 솔루션은 질문에서 언급하지 않았지만, 이것은 하나의 질문을 해결합니다. –

관련 문제