2016-11-03 15 views
0

関連するフィールドのフィールドに関連するフィールドを作成する方法を教えてください。私は2つのモデルを持っています:アルバムと写真、アルバムモデルはブールフィールドprivateを持っています。写真にフィールドprivateを作成する方法。アルバムフィールドがNoneの場合はFalseの値、そうでない場合はアルバムのプライベートフィールドの値があります。関連オブジェクトのフィールドに関連するフィールドDjango

models.py:

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

@RodXavierはちょうどプロパティ

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はい。できません。ルックアップとフィルタリングの両方で動作する1つのソリューションがあります。これはあなたの質問には言及していませんが、これはあなたが求めていたものを解決します –

関連する問題