2015-08-04 3 views
0

Ниже мой Django модели кодDjango модели отношений

from django.db import models 


class BookUser(models.Model): 
    email= models.CharField(max_length=254,primary_key=True)   #mail address key 
    name = models.CharField(max_length=254)     #max 64 char (lower case?) 
    contact= models.CharField(max_length=12) 
    imei = models.CharField(max_length=16)    #imei number 
    address= models.TextField()   #list of address ids 
    booksInShelf:[]  #list of user book's unique ids 
    booksUnderCirculation:[]  #list of user book's unique ids 


    class Meta: 
     ordering = ('email',) 

class Book(models.Model): 
    isbn = models.CharField(max_length=13) 
    title=models.CharField(max_length=500) 
    description =models.TextField() 
    author = models.CharField(max_length=200) 
    userRating = models.CharField(max_length=1) 
    users =   #list of user ids hold this book in shelf 

class UserBook(models.Model): 
    #id:     generated by django 
    bookId:    #id of parent book 
    rent= models.BooleanField(default=False)   #boolean is ready to rent 
    sell= models.BooleanField(default=False)     #boolean is ready to sell 
    price =models.FloatField()    #selling price 
    rentBase=models.FloatField()   #base price of rent 
    rentPeriod=models.IntegerField()    #days after which extra rent would apply 
    dateModified =models.DateTimeField(auto_now=True)    #track date it came into shelf 
    dateAdded = models.DateTimeField(auto_now_add=True) 

Здесь BookUser фактический пользователь, который имеет несколько книг по двум категориям, т.е. booksinShelf и bookUnderCirculation

класс Книга является центральным хранилищем книг, я необходимо определить отношение одного к большому отношению к BookUser. Какой простой способ сделать это?

Пользовательская книга предназначена только для BookUser, и она должна однозначно указывать на Class Book, поэтому ее отношение много к одному к Book Class.

Я смущен о том, как обращаться с идентификаторами UserBook и Book? Также как сохранить список идентификаторов UserBooks в классе BookUser ??

+0

Здравствуйте, @ eagle06 ваши комментарии запутываются рядом с вашими моделями, пожалуйста, исправьте, тогда вы скажете, что вам нужно отношение OneToMany к BookUser в вашей книге, но ваш комментарий говорит, что вам может понадобиться ManyToMany, а также в моделях BookUser, которые вы только что указали для уникальных идентификаторов, но подумайте дважды, что вам может понадобиться полная информация о книге, поэтому я сформулировал свой ответ на основе вашего объяснения не по комментариям в моделях , если это так, пожалуйста, отредактируйте вопрос и комментарий ниже моего комментария, как обновите вопрос выше пометки меня. –

ответ

0

Это должно делать то, что вы хотите:

class UserBook(models.Model): 
    bookId = models.ForeignKey('Book') 

Здесь в UserBook имеет ссылку на Book пункта, и severals пользователи могут иметь такую ​​же книгу, но она по-прежнему уникальная ссылка на вас столе книги.

Надеется, что это помогает

1

Посмотрев на модели и объяснении приведенной ниже Book модели поля в пользователях должны иметь ForeignKey отношений с BookUser модели.

так книга модель должна выглядеть

class Book(models.Model): 
    isbn = models.CharField(max_length=13) 
    title=models.CharField(max_length=500) 
    description =models.TextField() 
    author = models.CharField(max_length=200) 
    userRating = models.CharField(max_length=1) 
    users = models.ForeignKey(BookUser, null=True, blank=True)   

, если вы используете Postgresql и если вам просто нужно pk список booksInShelf и booksUnderCirculation тогда ваша модель BookUser должна выглядеть

class BookUser(models.Model): 
    email= models.CharField(max_length=254,primary_key=True)     
    name = models.CharField(max_length=254)     
    contact= models.CharField(max_length=12) 
    imei = models.CharField(max_length=16)     
    address= models.TextField()    
    booksInShelf = models.ArrayField(models.IntegerField())   
    booksUnderCirculation = models.ArrayField(models.IntegerField())   

и если вы хотите иметь полную информацию о booksInShelf и booksUnderCirculation (не только pk, но и другую информацию, связанную с книгой), то вам нужно d efine это как ManyToMany отношение.

class BookUser(models.Model): 
     email= models.CharField(max_length=254,primary_key=True)     
     name = models.CharField(max_length=254)     
     contact= models.CharField(max_length=12) 
     imei = models.CharField(max_length=16)     
     address= models.TextField()    
     booksInShelf = models.ManyToMany(UserBook) 
     booksUnderCirculation = models.ManyToMany(UserBook) 

также вместо создания двух ManyToMany полей в модели BookUser вы можете иметь два флага в вашей модели UserBook называется is_in_shelf и is_under_circulation. Эти поля будут BooleanField, вы можете узнать больше о полях модели в документации Django здесь: https://docs.djangoproject.com/en/1.10/topics/db/models/#fields

Смежные вопросы