2

Trying to do a GET request to return all cows with their vaccinations but vaccinations always return null. I've set the db models for both vaccines and cows to be linked. I'm not sure whats wrong.

Git repo is here to reproduce the problem: https://gitlab.com/iandjx/bokujo-api

VaccineModel

from db import db
from datetime import datetime


class VaccineModel(db.Model):

__tablename__ = "vaccines"
id = db.Column(db.Integer, primary_key=True)
vaccine_name = db.Column(db.String(20))
date_given = db.Column(db.DateTime)

cow_id = db.Column(db.Integer, db.ForeignKey('cow.id'))
cow = db.relationship('CowModel')

def __init__(self, vaccine_name, cow_id, date_given=None):
    self.vaccine_name = vaccine_name
    if date_given is None:
        date_given = datetime.now()
    self.date_given = date_given
    self.cow_id = cow_id

def __repr__(self):
    return 'vaccine name : {}, date_given : {}, private_id[] '.format(self.vaccine_name, self.date_given, self.cow_id)

def json(self):
    return {'vaccine_name': self.vaccine_name, 'date_given': self.date_given}

CowModel

from db import db
class CowModel(db.Model):

__tablename__ = "cow"
id = db.Column(db.Integer, primary_key=True)
pub_id = db.Column(db.String(20))
private_id = db.Column(db.String(10))
heredity = db.Column(db.String(10))

vaccines_given = db.relationship('VaccineModel', lazy='dynamic')

def __init__(self, pub_id, private_id, heredity):
    self.pub_id = pub_id
    self.private_id = private_id
    self.heredity = heredity

def __repr__(self):
    return 'public id : {}, private id : {}'.format(self.pub_id,       
self.private_id)

def json(self):
    return {'pub_id': self.pub_id, 'private_id': self.private_id}

@classmethod
def find_by_private_id(cls, private_id):
    return cls.query.filter_by(id=private_id).first()

serializers

from flask_restplus import fields
from api.restplus import api

vaccine = api.model('Vaccine', {
'vaccine_name': fields.String(readOnly=True, description='Vaccine Name'),
'date_given': fields.DateTime,
'cow_id': fields.Integer,
})

cow = api.model('Cow Make', {
'pub_id': fields.String(readOnly=True, description='Government ID'),
'private_id': fields.String(required=True, description='Bokujo ID'),
'heredity': fields.String(required=True, description='Heredity of Cow'),
})

cow_with_vaccine = api.inherit('Cow with vaccinations', cow, {
'vaccinations': fields.List(fields.Nested(vaccine))
})

cow.py

from flask_restplus import Resource
from api.restplus import api
from api.core.serializers import cow, cow_with_vaccine
from flask import request
from api.core.business import create_cow, find_cow
from api.core.parsers import heredity_arguments

ns = api.namespace('cows', description='Cow Operations')


@ns.route('/')
class Cow(Resource):
'''Shows all cows in he farm'''
@ns.doc('list_cows')
@api.expect(heredity_arguments)
@ns.marshal_list_with(cow_with_vaccine)
def get(self):
    '''List all cows'''
    args = heredity_arguments.parse_args(request)
    return find_cow(args)

@ns.doc('create_cow')
@ns.expect(cow)
@ns.marshal_with(cow, code=201)
def post(self):
    '''Create a new cow'''
    create_cow(request.json)

    return request.json, 201

vaccine.py

from flask_restplus import Resource
from api.restplus import api
from api.core.serializers import vaccine
from flask import request
from api.core.business import find_vaccine,give_vaccine

ns = api.namespace('vaccines', description='Cow Operations')

@ns.route('/')
class Vaccine(Resource):
'''Shows all vaccinen'''
@ns.doc('list_vaccine')
@ns.marshal_list_with(vaccine)
def get(self):
    '''List all vaccines given'''
    return find_vaccine()

@ns.doc('give_vaccine')
@ns.expect(vaccine)
@ns.marshal_with(vaccine, code=201)
def post(self):
    '''Create a new cow'''
    give_vaccine(request.json)

    return request.json, 201

business.py

# from rest_api_demo.database import db
# from rest_api_demo.database.models import Post, Category
from db import db
from models.cow import CowModel
from models.vaccine import VaccineModel


def create_cow(data):
pub_id = data.get('pub_id')
private_id = data.get('private_id')
heredity = data.get('heredity')
cow = CowModel(pub_id, private_id, heredity)
db.session.add(cow)
db.session.commit()


def find_cow(data):
if data.get('heredity') == 'all':
    return CowModel.query.all()
if data.get('heredity'):
    return CowModel.query.filter_by(heredity=data.get('heredity')).all()


def give_vaccine(data):
vaccine_name = data.get('vaccine_name')
# date_given = data.get('date_given')
cow_id = data.get('cow_id')
print(data)
vaccine = VaccineModel(vaccine_name, cow_id)
print(vaccine)
db.session.add(vaccine)
db.session.commit()


def find_vaccine():
return VaccineModel.query.all()
fardown
  • 713
  • 2
  • 12
  • 23

0 Answers0