2017-11-19 3 views
0

In Ordnung, also bin ich sicher, dass der Titel ziemlich verwirrend war, also werde ich mein Bestes geben, um es hier zu erklären. Ich bin dabei, eine einfache Website zu erstellen, auf der Nutzer nach Filmen und Fernsehsendungen suchen können. Wenn sie ein Benutzer sind, haben sie auch die Möglichkeit, Movie/Tv show zu ihrer Watchlist hinzuzufügen. Ab jetzt habe ich diese Tabellen:Erzeuge Eintrag in einer anderen Tabelle, wenn ein Eintrag erstellt wird

class User(db.Model, UserMixin): 
    id = db.Column(db.Integer, autoincrement=True, primary_key=True) 
    watchList_id = db.Column(db.Integer, db.ForeignKey('watchList.watchList_id'), nullable=False, autoincrement=True) 
    first_name = db.Column(db.String(120)) 
    last_name = db.Column(db.String(120)) 
    email = db.Column(db.String(180), unique=True) 
    password = db.Column(db.String(255)) 
    is_admin = db.Column(db.Boolean(), default=False) 
    active = db.Column(db.Boolean()) 
    confirmed_at = db.Column(db.DateTime()) 
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) 


class watchList(db.Model): 
    __tablename__ = "watchList" 

    watchList_id = db.Column(db.Integer, autoincrement=True, primary_key=True) 
    title = db.Column(db.String(200), unique=True) 
    releaseDate = db.Column(db.Date) 
    producer = db.Column(db.String(100)) 
    description = db.Column(db.String(300)) 
    genre = db.Column(db.String(50)) 
    image = db.Column(db.String(300)) 

Ich mag im Grunde um die Funktionalität zu denen, wenn ein Benutzer eine Watchlist für den Benutzer erstellt wird, auch erstellt wird, aber im Moment halte ich den Fehler bekommen, dass sie keinen Wert für watchList_id, wenn ein Benutzer erstellt wird, was Sinn macht, da ich eine Idee haben muss, wie man das macht. Ich dachte daran, die user_id == watchList_id irgendwie zu setzen, aber ich war mir nicht sicher, wie ich das machen sollte. Irgendwelche Ideen? Ich kann bei Bedarf mehr Code senden. Ich verwende flash-security, daher weiß ich nicht, wie ich den python/flask-Code für Register sehen soll.

Antwort

0

Ich denke, Sie sollten benutzerdefinierte Methode für diesen Zweck verwenden. Es kann für Sie nützlich sein, aber ich habe Code nicht ausgeführt, also können Sie entsprechend ändern.

class watchList(db.Model): 
    __tablename__ = "watchList" 

    watchList_id = db.Column(db.Integer, autoincrement=True, 
    primary_key=True) 
    title = db.Column(db.String(200), unique=True) 
    releaseDate = db.Column(db.Date) 
    producer = db.Column(db.String(100)) 
    description = db.Column(db.String(300)) 
    genre = db.Column(db.String(50)) 
    image = db.Column(db.String(300)) 

    @classmethod 
    def create_func(cls, **kw): 
      obj = cls(**kw) 
      #----creating User object with obj(watchList) 

Wenn Sie fertig sind, bitte sagen Sie mir. Danke.

+0

So rufe ich diese Klassenmethode woanders? Muss ich irgendetwas mit dem Code tun, den ich geschrieben habe, um die User-Tabelle zu erstellen? Was ist Cls? – humbleCoder

+0

Wenn Sie WatchList-Objekt erstellen dann rufen Sie diese Methode ...... und Cls besuchen Sie bitte https://StackOverflow.com/questions/7554738/python-self-no-self-and-cls – GauravInno

0

Wenn Sie die Sitzung korrekt verwenden, ist dies so einfach wie das Hinzufügen zum Konstruktor für den Benutzer. Der Benutzerkonstruktor erstellt ein neues Beobachtungslistenobjekt und hängt es an die zugeordnete Beziehung an. Wenn der Aufruf zum Erstellen des Benutzers festgeschrieben wird, werden beide erstellt und beide erhalten zu diesem Zeitpunkt ihre IDs. Sieht man sich Ihren Code an, scheint es mir, dass Sie die Beziehungen vielleicht rückwärts haben. Wenn die Watchlist dem Benutzer gehört, haben Sie normalerweise eine user_id-Spalte in der Watchlist, die ein Fremdschlüssel für den Benutzer ist, und haben dann eine zugeordnete Beziehung für Benutzer für "Watchlists". Wenn Sie sicherstellen möchten, dass es nur einen pro Benutzer gibt, können Sie das gleiche Muster verwenden, aber übergeben Sie die Syntax uselist = False in die Beziehung.

Dann können Sie Ihre Benutzerklasse tun:

class User(db.Model, UserMixin): 
    def __init__(self, **kwargs): 
     # set up cols for user 
     for k,v in kwargs.items(): 
      setattr(self, k, v) 
     # create watchlist: watchlist and user will both get their ids 
     # created at the same time when the session creating User 
     # is committed, and watchlist will have the user_id key too 
     self.watchlist = Watchlist() 

Ich würde empfehlen, Ihren Weg durch das ausgezeichnete SQLAlchemy ORM Tutorial arbeiten, wenn Sie nicht bereits getan haben. Eine gute Faustregel ist, dass, wenn Sie irgendetwas manuell mit Ihren ID-Spalten tun müssen, Sie die Sitzung falsch verwenden. HTH!

Verwandte Themen