2017-04-23 19 views
1

私はDjangoを使用してバス予約Webサイトを開発しています。私は別のDjangoアプリに2つのモデルファイルを持っています。モデルクラスの1つはBusで、もう1つは座席です。バスクラスには整数フィールドがあります。私は、バスがデータベースに作成されると、自動的にループが実行され、バスクラスの容量と同じ座席が作成されます。おそらく、あなたは私のモデルファイルを見て、より明瞭なビューを得るでしょう。ジャンゴモードの自動生成シート

のsrc \帳の\ models.py

from django.db import models 
from django.contrib.auth.models import User 
from web.models import Bus, Route 

class Booking(models.Model): 
    class Meta: 
     verbose_name_plural = "Booking" 
    user = models.ForeignKey(User) 
    #session = models.ForeignKey(sessions.Sessions) 
    name = models.CharField(max_length=50) 
    gender = models.CharField(max_length=10, choices=(('Mr', 'mr'), ('Mrs', 'mrs'), ('Ms', 'ms'),)) 
    age = models.IntegerField() 
    email = models.EmailField() 
    phone = models.IntegerField() 
    bus = models.ForeignKey(Bus, default='') 

    def __str__(self): 
     return self.name 

class Seat(models.Model): 
    class Meta: 
     verbose_name_plural = "Seat" 
    for seats in range(1,int(float(Bus.capacity)+1.0)): 
     id = models.AutoField(primary_key=True) 
     bus = models.ForeignKey(Bus) 

    def __str__(self): 
     return str(self.id) 



class Ticket(models.Model): 
    class Meta: 
     verbose_name_plural = "Ticket" 
    seat = models.ForeignKey(Seat) 
    bus = models.ForeignKey(Bus) 
    route = models.ForeignKey(Route, default='') 

    def __str__(self): 
     return str(self.id) 
のsrc \ウェブ\のmodels.py \

from django.db import models 
from django.core.exceptions import ValidationError 


class Route(models.Model): 
    class Meta: 
     verbose_name_plural = "Routes" 

    BUSFROM = (
    ('Delhi', 'Delhi'), 
    ('Jaipur', 'Jaipur'), 
    ('Ajmer', 'Ajmer'), 
    ) 

    BUSTO = (
    ('Ajmer', 'Ajmer'), 
    ('Chandigarh', 'Chandigarh'), 
    ('Delhi', 'Delhi'), 
    ) 

    route_id = models.AutoField(primary_key=True,)  
    location_from = models.CharField(max_length=255, choices=BUSFROM) 
    location_to = models.CharField(max_length=255,choices=BUSTO)  
    route_name = models.CharField(max_length=500, default='', editable=False) 


    def __str__(self): 
     if self.location_from == self.location_to: 
      raise ValidationError('To and From Can\'t be the same') 
     self.route_name = '{0}-{1}'.format(str(self.location_from), str(self.location_to)) 
     return self.route_name 


class Bus(models.Model): 

    BUSTYPE = (
    ('Volvo', 'Volvo'), 
    ('Ordinary', 'Ordinary'), 
    ) 
    class Meta: 
     verbose_name_plural = "Bus" 
    type_of_bus = models.CharField(max_length=255, choices=BUSTYPE) 
    bus_registration = models.CharField(max_length=255, default='') 
    capacity = models.IntegerField(default=0) 
    bus_number = models.IntegerField() 
    route = models.ForeignKey(Route,) 


    def __str__(self): 
     return '{0}, {1}, {2}'.format(str(self.bus_number), self.type_of_bus, self.route) 

あなたが本の中で見ることができるように\ \ models.py、forループは遅延オブジェクトの明白な理由で失敗します。

また、バスの周波数を追加するためのweb \ models.pyに頻度クラスを作成したいとします。日時フィールドを作成すると、各バスオブジェクトを何度も繰り返す必要がありますが、これはあまり便利ではありません。だから、どんな提案も大歓迎です。あなたが見る必要がある他のファイルがある場合は教えてください。ありがとう。

答えて

1

私の意見では、問題の最も洗練された解決策はdjango post_save signalです。

from django.db.models.signals import post_save 
from django.dispatch import receiver 

class Bus(models.Model): 
    # ... fields here 

class Seat(models.Model): 
    id = models.AutoField(primary_key=True) 
    bus = models.ForeignKey(Bus) 
    # ... 

# function to create seats 
@receiver(post_save, sender=Bus) 
def create_seats(sender, instance, created, **kwargs): 
    if created: 
     for seat in range (0, instance.capacity): 
      instance.seat_set.create() 

もう1つの解決策は、バスセーブ方法を上書きすることです。

+0

それは働いた。ありがとう、トン!あなたがしたことを説明していただけますか?また、バスモデルに周波数を追加したい場合は、どのように行うか提案はありますか? –